/ Hex Artifact Content
Login

Artifact e1b5c898ef2d6ed772d76b695765f0d24aa9719c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 30 30 20 32 30 30 38 2f 30  c,v 1.500 2008/0
0190: 38 2f 32 32 20 31 32 3a 35 37 3a 30 39 20 64 72  8/22 12:57:09 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 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
2a40: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
2a50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2a70: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
2a80: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
2a90: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
2aa0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ab0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ac0: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2ad0: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2ae0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2af0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
2b00: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2b10: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
2b20: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
2b30: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
2b40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2b50: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
2b60: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
2b70: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
2b80: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
2b90: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2ba0: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
2bb0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
2bc0: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
2bd0: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
2be0: 61 74 2e 20 20 43 75 72 73 6f 72 20 63 61 6e 20  at.  Cursor can 
2bf0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
2c00: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
2c10: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
2c20: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
2c30: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
2c40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
2c50: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
2c60: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
2c70: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
2c80: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
2c90: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
2ca0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
2cb0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
2cc0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
2cd0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
2ce0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
2cf0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2d00: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
2d10: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
2d20: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2d30: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
2d40: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
2d50: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
2d60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d70: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d80: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d90: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d   || pCur->skip!=
2da0: 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  0 ){.    *pHasMo
2db0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
2dc0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
2dd0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
2de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2df0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e00: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e10: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2e20: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2e30: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2e40: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2e50: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2e60: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2e70: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2e80: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2e90: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2ea0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2eb0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
2ec0: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
2ed0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2ee0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
2ef0: 65 73 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50  esPerMapPage, iP
2f00: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
2f10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f20: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2f30: 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73  tex) );.  nPages
2f40: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
2f50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
2f60: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
2f70: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
2f80: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
2f90: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
2fa0: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
2fb0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
2fc0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2fd0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
2fe0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2ff0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
3000: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
3010: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
3020: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
3030: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
3040: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
3050: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
3060: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
3070: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
3080: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
3090: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
30a0: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
30b0: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
30c0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
30d0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
30e0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
30f0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
3100: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
3110: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
3120: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
3130: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
3140: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
3150: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
3160: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
3170: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
3180: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
3190: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
31a0: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
31b0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
31c0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
31d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
31e0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
31f0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
3200: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
3210: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
3220: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3230: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3240: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
3250: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
3260: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
3270: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
3280: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3290: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
32a0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
32b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
32c0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
32d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
32e0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
32f0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
3300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
3310: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
3320: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
3330: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
3340: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3350: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
3360: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
3370: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
3380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3390: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
33a0: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
33b0: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
33c0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
33d0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
33e0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
33f0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
3400: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
3410: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
3420: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
3430: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
3440: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
3450: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
3460: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
3470: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
3480: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63  parent));.    rc
3490: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34a0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
34b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
34d0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
34e0: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
34f0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
3500: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
3510: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
3520: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
3530: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65  f(pDbPage);.  re
3540: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
3550: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
3560: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
3570: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
3580: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
3590: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
35a0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
35b0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
35c0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
35d0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
35e0: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
35f0: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
3600: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
3610: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
3620: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
3630: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
3640: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
3650: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
3660: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
3670: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
3680: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
3690: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
36a0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
36b0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
36c0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
36d0: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
36e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
36f0: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
3700: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
3710: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3720: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
3730: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
3740: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
3750: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
3760: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
3770: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
3780: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3790: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
37a0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
37b0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
37c0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
37d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
37e0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
37f0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
3800: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
3810: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
3820: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
3830: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
3840: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
3850: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
3860: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
3870: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
3880: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
3890: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
38a0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
38b0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
38c0: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
38d0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
38e0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
38f0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
3900: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
3910: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
3920: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
3930: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
3940: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3950: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
3960: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
3970: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
3980: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
3990: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
39a0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
39b0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
39c0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
39d0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
39e0: 72 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29  rmapPutOvfl(y,z)
39f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
3a00: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
3a10: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
3a20: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
3a30: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
3a40: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
3a50: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
3a60: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
3a70: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
3a80: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
3a90: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
3aa0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
3ab0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
3ac0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
3ad0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
3ae0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
3af0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
3b00: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
3b10: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
3b20: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
3b30: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
3b40: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
3b50: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
3b60: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
3b70: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
3b80: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
3b90: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
3ba0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
3bb0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
3bc0: 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74  lls.  See insert
3bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
3be0: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
3bf0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
3c00: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
3c10: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t i;.  assert( s
3c20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3c30: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
3c40: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  tex) );.  for(i=
3c50: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
3c60: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3c70: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
3c80: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
3c90: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
3ca0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
3cb0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
3cc0: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
3cd0: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
3ce0: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
3cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3d00: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
3d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3d20: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
3d30: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
3d40: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3d50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
3d60: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
3d70: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
3d80: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
3d90: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
3da0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
3db0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
3dc0: 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33  nction.  sqlite3
3dd0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
3de0: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
3df0: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
3e00: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
3e10: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nd sqlite3BtreeP
3e20: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a  arseCellPtr() .*
3e30: 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65  * takes a pointe
3e40: 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66  r to the body of
3e50: 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73   the cell as its
3e60: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
3e70: 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ..**.** Within t
3e80: 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61  his file, the pa
3e90: 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20  rseCell() macro 
3ea0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  can be called in
3eb0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69  stead of.** sqli
3ec0: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
3ed0: 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f  lPtr(). Using so
3ee0: 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68  me compilers, th
3ef0: 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65  is will be faste
3f00: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
3f10: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3f20: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
3f30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
3f40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
3f50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
3f60: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3f80: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
3f90: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
3fa0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
3fb0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
3fc0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
3fd0: 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  {.  int n;      
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3ff0: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
4000: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
4010: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
4020: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
4030: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4040: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
4050: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
4060: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4070: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
4080: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e  mutex) );..  pIn
4090: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
40a0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
40b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
40c0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
40d0: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
40e0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
40f0: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
4100: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
4110: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
4120: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
4130: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
4140: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
4150: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
4160: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65  Payload);.    }e
4170: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c  lse{.      nPayl
4180: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oad = 0;.    }. 
4190: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
41a0: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
41b0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
41c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  ;.    pInfo->nDa
41d0: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
41e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
41f0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  o->nData = 0;.  
4200: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
4210: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
4220: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e  ayload);.    pIn
4230: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
4240: 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  oad;.  }.  pInfo
4250: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
4260: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
4270: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69  nHeader = n;.  i
4280: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
4290: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
42a0: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
42b0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
42c0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
42d0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
42e0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
42f0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
4300: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
4310: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
4320: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
4330: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
4340: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
4350: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
4360: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69  bytes */.    nSi
4370: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
4380: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  n;.    pInfo->nL
4390: 6f 63 61 6c 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  ocal = nPayload;
43a0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
43b0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69  rflow = 0;.    i
43c0: 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d  f( (nSize & ~3)=
43d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  =0 ){.      nSiz
43e0: 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a  e = 4;        /*
43f0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
4400: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d  ze is 4 */.    }
4410: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
4420: 65 20 3d 20 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  e = nSize;.  }el
4430: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
4440: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
4450: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
4460: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
4470: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
4480: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
4490: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
44a0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
44b0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
44c0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
44d0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
44e0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
44f0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
4500: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
4510: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
4520: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
4530: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
4540: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
4550: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
4560: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
4570: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
4580: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
4590: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
45a0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
45b0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
45c0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
45d0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
45e0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
45f0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
4600: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
4610: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
4620: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
4630: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
4640: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
4650: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
4660: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
4670: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
4680: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
4690: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
46a0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
46b0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
46c0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
46d0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
46e0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
46f0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
4700: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
4710: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
4720: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
4730: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
4740: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
4750: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
4760: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
4770: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
4780: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
4790: 61 6c 20 3d 20 73 75 72 70 6c 75 73 3b 0a 20 20  al = surplus;.  
47a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
47b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6d  Info->nLocal = m
47c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
47d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
47e0: 6c 6f 77 20 3d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  low = pInfo->nLo
47f0: 63 61 6c 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  cal + n;.    pIn
4800: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66  fo->nSize = pInf
4810: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34  o->iOverflow + 4
4820: 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20  ;.  }.}.#define 
4830: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
4840: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c   iCell, pInfo) \
4850: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
4860: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
4870: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
4880: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
4890: 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73   (pInfo)).void s
48a0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
48b0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
48c0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
48d0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
48e0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
48f0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
4900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4910: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
4920: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
4930: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
4940: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
4950: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
4960: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
4970: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
4980: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
4990: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
49a0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
49b0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
49c0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
49d0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
49e0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
49f0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
4a00: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
4a10: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
4a20: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
4a30: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
4a40: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
4a50: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
4a60: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
4a70: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
4a80: 65 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  er..*/.#ifndef N
4a90: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
4aa0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
4ab0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
4ac0: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
4ad0: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
4ae0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
4af0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 26 69 6e  Page, iCell, &in
4b00: 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  fo);.  return in
4b10: 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  fo.nSize;.}.#end
4b20: 69 66 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  if.static u16 ce
4b30: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
4b40: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
4b50: 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ell){.  CellInfo
4b60: 20 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33   info;.  sqlite3
4b70: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
4b80: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
4b90: 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  &info);.  return
4ba0: 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a   info.nSize;.}..
4bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4bc0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
4bd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
4be0: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
4bf0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
4c00: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
4c10: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
4c20: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
4c30: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
4c40: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
4c50: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
4c60: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
4c70: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
4c80: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
4c90: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
4ca0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
4cb0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
4cc0: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
4cd0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
4ce0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
4cf0: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
4d00: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
4d10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
4d20: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
4d30: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
4d40: 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
4d50: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
4d60: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
4d70: 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50  .nLocal ){.    P
4d80: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
4d90: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
4da0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
4db0: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
4dc0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
4dd0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
4de0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
4df0: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
4e00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
4e10: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
4e20: 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c  with index iCell
4e30: 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63   on page pPage c
4e40: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
4e50: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
4e60: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
4e70: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
4e80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
4e90: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
4ea0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
4eb0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4ec0: 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Ovfl(MemPage *pP
4ed0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4ee0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
4ef0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4f00: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
4f10: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
4f20: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
4f30: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
4f40: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
4f50: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
4f60: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4f70: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
4f80: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
4f90: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
4fa0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
4fb0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
4fc0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
4fd0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
4fe0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
4ff0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
5000: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
5010: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
5020: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
5030: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
5040: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
5050: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
5060: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 66  .static void def
5070: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
5080: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
5090: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
50a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
50b0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
50c0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
50d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
50e0: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
50f0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
5100: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5110: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
5120: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
5130: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
5140: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
5150: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
5160: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
5170: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
5180: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
51b0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
51c0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
51d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
51e0: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
51f0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
5200: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
5210: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5220: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
5230: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
5240: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
5250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5260: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
5270: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
5280: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
52b0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
52c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
52d0: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
52e0: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
52f0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5300: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
5310: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
5320: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
5330: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5340: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
5350: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
5360: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
5370: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
5380: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5390: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
53a0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
53b0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
53c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
53d0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
53e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
53f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
5400: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
5410: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
5420: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
5430: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
5440: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
5450: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
5460: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
5470: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
5480: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
5490: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
54a0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
54b0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
54c0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
54d0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
54e0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
54f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
5500: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
5510: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5520: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
5530: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
5540: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
5550: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
5560: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
5570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
5580: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
5590: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
55a0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
55b0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
55c0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
55d0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
55e0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
55f0: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
5600: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5610: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5620: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
5630: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
5640: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
5650: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
5660: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
5670: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
5680: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
5690: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
56a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
56b0: 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b  brk>=cellOffset+
56c0: 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74  2*nCell );.  put
56d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
56e0: 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74  5], cbrk);.  dat
56f0: 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20  a[hdr+1] = 0;.  
5700: 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b  data[hdr+2] = 0;
5710: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
5720: 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65 6c   0;.  addr = cel
5730: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b  lOffset+2*nCell;
5740: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
5750: 61 64 64 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61  addr], 0, cbrk-a
5760: 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ddr);.}../*.** A
5770: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
5780: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20  tes of space on 
5790: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  a page..**.** Re
57a0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
57b0: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
57c0: 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  [] of the first 
57d0: 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  byte of.** the n
57e0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ew allocation.  
57f0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
5800: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
5810: 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70   is enough.** sp
5820: 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ace.  This routi
5830: 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61  ne will never fa
5840: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
5850: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
5860: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
5870: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
5880: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
5890: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
58a0: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
58b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
58c0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
58d0: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
58e0: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
58f0: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
5900: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
5910: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
5920: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
5930: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
5940: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
5950: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
5960: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5970: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
5980: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
5990: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
59a0: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
59b0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
59c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
59d0: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
59e0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
59f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5a00: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5a10: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5a20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5a30: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
5a40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5a50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5a60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5a70: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
5a80: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
5a90: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
5aa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5ab0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
5ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5ad0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
5ae0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
5af0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
5b00: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
5b10: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
5b20: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
5b30: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
5b40: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
5b50: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
5b60: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
5b70: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
5b80: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
5b90: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
5ba0: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
5bb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
5bc0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5bd0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
5be0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
5bf0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
5c10: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
5c20: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
5c30: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
5c40: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
5c50: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
5c60: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
5c70: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
5c80: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
5c90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
5ca0: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
5cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5cc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5cd0: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
5ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
5cf0: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
5d00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5d10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5d20: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
5d30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
5d40: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
5d50: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
5d60: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
5d70: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
5d80: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
5d90: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
5da0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
5db0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
5dc0: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
5dd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
5de0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5df0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
5e00: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
5e10: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
5e20: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
5e30: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
5e40: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
5e50: 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d  Page);.    top =
5e60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5e70: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5e80: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5e90: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5ea0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5eb0: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5ec0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5ed0: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5ee0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5ef0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5f00: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5f10: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5f20: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5f30: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5f40: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5f50: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5f60: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5f70: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5f80: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5f90: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5fa0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5fb0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5fc0: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5fd0: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5fe0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5ff0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
6000: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
6010: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
6020: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
6030: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
6040: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
6050: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
6060: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
6070: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
6080: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
6090: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
60a0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
60b0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
60c0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
60d0: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
60e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
60f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
6100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
6110: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
6120: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6130: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
6140: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6150: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6160: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
6170: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
6180: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
6190: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
61a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
61b0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
61c0: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
61d0: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
61e0: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
61f0: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
6200: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
6210: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
6220: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
6230: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
6240: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
6250: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
6260: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
6270: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
6280: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
6290: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
62a0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
62b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
62c0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
62d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
62e0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
62f0: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
6300: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6310: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6320: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6330: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6340: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
6350: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
6360: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6370: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6380: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6390: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
63a0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
63b0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
63c0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
63d0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
63e0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
63f0: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
6400: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
6410: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
6420: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
6430: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
6440: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
6450: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
6460: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6470: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
6480: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6490: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
64a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
64b0: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
64c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
64d0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
64e0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
64f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6500: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
6510: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6520: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
6530: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
6540: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
6550: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
6560: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
6570: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
6580: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
6590: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
65a0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
65b0: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
65c0: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
65d0: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
65e0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
65f0: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
6600: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
6610: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6620: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
6630: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
6640: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6650: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
6660: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
6670: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
6680: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
6690: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
66a0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
66b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
66c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
66d0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
66e0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
66f0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
6700: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
6710: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
6720: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
6730: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
6740: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
6750: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
6760: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
6770: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
6780: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
6790: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
67a0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
67b0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
67c0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
67d0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
67e0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
67f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
6800: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
6810: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
6820: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
6830: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
6840: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
6850: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
6860: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
6870: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
6880: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
6890: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
68a0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
68b0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
68c0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
68d0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
68e0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
68f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6900: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
6910: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
6920: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
6930: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
6940: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
6950: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
6960: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
6970: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
6980: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
6990: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
69a0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
69b0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
69c0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
69d0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
69e0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
69f0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6a00: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6a10: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6a30: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6a40: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6a50: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
6a60: 61 66 20 3d 20 66 6c 61 67 42 79 74 65 3e 3e 33  af = flagByte>>3
6a70: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
6a80: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
6a90: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
6aa0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
6ab0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6ac0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
6ad0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6ae0: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
6af0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
6b00: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
6b10: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
6b20: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
6b30: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6b40: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
6b50: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6b60: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
6b70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6b80: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6b90: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
6ba0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
6bb0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
6bc0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
6bd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
6be0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
6bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
6c00: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
6c10: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
6c20: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
6c30: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
6c40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
6c60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6c70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
6c80: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
6c90: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
6ca0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
6cb0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ock..**.** The p
6cc0: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
6cd0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
6ce0: 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
6cf0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68  e which.** is th
6d00: 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
6d10: 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69  page being initi
6d20: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f  alized.  The roo
6d30: 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20  t of a.** BTree 
6d40: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e  has no parent an
6d50: 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61  d so for that pa
6d60: 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c  ge, pParent==NUL
6d70: 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
6d80: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
6d90: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
6da0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
6db0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
6dc0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
6dd0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
6de0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
6df0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
6e00: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
6e10: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
6e20: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
6e30: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
6e40: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
6e50: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
6e60: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
6e70: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
6e80: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
6e90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6ea0: 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20 4d  reeInitPage(.  M
6eb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6ec0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
6ed0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
6ee0: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
6ef0: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
6f00: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
6f10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6f20: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
6f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6f40: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
6f50: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
6f60: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
6f70: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
6f80: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
6f90: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
6fa0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
6fb0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
6fc0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
6fd0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
6fe0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
6ff0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
7000: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
7010: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
7020: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
7030: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
7040: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
7050: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
7060: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
7070: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
7080: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
7090: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
70a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
70b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
70c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
70d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
70e0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
70f0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
7100: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7110: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20   area */..  pBt 
7120: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
7130: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
7140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
7150: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
7160: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
7170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
71a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
71b0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
71c0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
71d0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
71e0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
71f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7200: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
7210: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7220: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
7230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7240: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
7250: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 70 50  age) );.  if( pP
7260: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50  age->pParent!=pP
7270: 61 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d  arent && (pPage-
7280: 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70  >pParent!=0 || p
7290: 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b  Page->isInit) ){
72a0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  .    /* The pare
72b0: 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e  nt page should n
72c0: 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65  ever change unle
72d0: 73 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ss the file is c
72e0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
72f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7300: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7310: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
7320: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
7330: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
7340: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26  e->pParent==0 &&
7350: 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20   pParent!=0 ){. 
7360: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
7370: 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
7380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
7390: 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
73a0: 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20  e);.  }.  hdr = 
73b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
73c0: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
73d0: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 66 28 20 64  ->aData;.  if( d
73e0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
73f0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
7400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7410: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 61 73 73  RUPT_BKPT;.  ass
7420: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
7430: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
7440: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
7450: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
7460: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
7470: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67  Size - 1;.  pPag
7480: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
7490: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
74a0: 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c  ift = 0;.  usabl
74b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
74c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  bleSize;.  pPage
74d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
74e0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
74f0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
7500: 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65  leaf;.  top = ge
7510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7520: 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  +5]);.  pPage->n
7530: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
7540: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
7550: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
7560: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
7570: 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
7580: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
7590: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
75a0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
75b0: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
75c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
75d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
75e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
75f0: 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26   && pParent!=0 &
7600: 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
7610: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =1 ){.    /* All
7620: 20 70 61 67 65 73 20 6d 75 73 74 20 68 61 76 65   pages must have
7630: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
7640: 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72  ll, except for r
7650: 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  oot pages */.   
7660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7670: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7680: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
7690: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
76a0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
76b0: 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  */.  pc = get2by
76c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
76d0: 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61  ;.  nFree = data
76e0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20  [hdr+7] + top - 
76f0: 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  (cellOffset + 2*
7700: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
7710: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
7720: 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69      int next, si
7730: 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75  ze;.    if( pc>u
7740: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
7750: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
7760: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
7770: 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ge */.      retu
7780: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7790: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
77a0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
77b0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
77c0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
77d0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
77e0: 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
77f0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
7800: 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  +3 ){.      /* F
7810: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
7820: 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  be in accending 
7830: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72  order */.      r
7840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7850: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
7860: 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  }.    nFree += s
7870: 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65  ize;.    pc = ne
7880: 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  xt;.  }.  pPage-
7890: 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a  >nFree = nFree;.
78a0: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
78b0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f  bleSize ){.    /
78c0: 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e  * Free space can
78d0: 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c  not exceed total
78e0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
78f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7900: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7910: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43   }..#if 0.  /* C
7920: 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68  heck that all th
7930: 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65  e offsets in the
7940: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
7950: 61 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ay are within ra
7960: 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a  nge. .  ** .  **
7970: 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63   Omitting this c
7980: 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b  onsistency check
7990: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70   and using the p
79a0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d  Page->maskPage m
79b0: 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ask.  ** to prev
79c0: 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20  ent overrunning 
79d0: 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 20  the page buffer 
79e0: 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65  in findCell() re
79f0: 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20  sults in a.  ** 
7a00: 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65  2.5% performance
7a10: 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a   gain..  */.  {.
7a20: 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20      u8 *pOff;   
7a30: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
7a40: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61   used to check a
7a50: 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  ll cell offsets 
7a60: 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  are in range */.
7a70: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20      u8 *pEnd;   
7a80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7a90: 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f  to end of cell o
7aa0: 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20  ffset array */. 
7ab0: 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20     u8 mask;     
7ac0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62      /* Mask of b
7ad0: 69 74 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  its that must be
7ae0: 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20   zero in MSB of 
7af0: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a  cell offsets */.
7b00: 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75      mask = ~(((u
7b10: 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
7b20: 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45  >>8))-1);.    pE
7b30: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
7b40: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
7b50: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72  Cell*2];.    for
7b60: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
7b70: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
7b80: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
7b90: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
7ba0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d  ;.    if( pOff!=
7bb0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65  pEnd ){.      re
7bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7bd0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
7be0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 50    }.#endif..  pP
7bf0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
7c00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
7c20: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
7c30: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
7c40: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
7c50: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
7c60: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
7c70: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
7c80: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
7c90: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
7ca0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7cb0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
7cc0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
7cd0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
7ce0: 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d  pBt;.  int hdr =
7cf0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7d00: 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a  t;.  int first;.
7d10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7d20: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
7d30: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
7d40: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
7d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7d60: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
7d70: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7d80: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
7d90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7da0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7db0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7dc0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
7dd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7de0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7df0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7e10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7e20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7e30: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
7e40: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
7e50: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
7e60: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
7e70: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
7e80: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
7e90: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
7ea0: 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  0);.  memset(&da
7eb0: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
7ec0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7ed0: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
7ee0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
7ef0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
7f00: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
7f10: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
7f20: 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f   - first;.  deco
7f30: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
7f40: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
7f50: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
7f60: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
7f70: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
7f80: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7f90: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7fa0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
7fb0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
7fc0: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
7fd0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
7fe0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
7ff0: 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  - 1;.  pPage->id
8000: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
8010: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
8020: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
8030: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
8040: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
8050: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
8060: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
8070: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
8080: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
8090: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
80a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
80b0: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
80c0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
80d0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
80e0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
80f0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
8100: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
8110: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
8120: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
8130: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
8140: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
8150: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
8160: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
8170: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
8180: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
8190: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
81a0: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
81b0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
81c0: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
81d0: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
81e0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
81f0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
8200: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
8210: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
8220: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8230: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
8240: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
8250: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
8260: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
8270: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8280: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
8290: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
82a0: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
82b0: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
82c0: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
82d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
82e0: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
82f0: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
8300: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
8310: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
8320: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8330: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
8340: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
8350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8360: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8370: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8380: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
8390: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
83a0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
83b0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
83c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
83d0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
83e0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
83f0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8400: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
8410: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
8420: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8430: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
8440: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
8450: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
8460: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
8470: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
8480: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8490: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
84a0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
84b0: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
84c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
84d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
84e0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
84f0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
8500: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
8510: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
8520: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
8530: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
8540: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
8550: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
8560: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
8570: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
8580: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
8590: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
85a0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
85b0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
85c0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
85d0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
85e0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
85f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
8600: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
8610: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
8620: 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e,    /* Write t
8630: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
8640: 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  here */.  MemPag
8650: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f  e *pParent     /
8660: 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20  * Parent of the 
8670: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
8680: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
8690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
86a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
86b0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
86c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
86d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
86e0: 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  ; .  }.  rc = sq
86f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8700: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
8710: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8730: 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
8740: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
8750: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
8760: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
8770: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
8780: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8790: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
87a0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
87b0: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
87c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
87d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
87e0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
87f0: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
8800: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
8810: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
8820: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
8830: 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a  3BtreeGetPage..*
8840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
8850: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
8860: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
8870: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
8880: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
8890: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
88a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
88b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
88c0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
88d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
88e0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
88f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8900: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8910: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8920: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
8930: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
8940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
8970: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
8980: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
8990: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
89a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
89b0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65  lled when the re
89c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
89d0: 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63  r a page.** reac
89e0: 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65  hes zero.  We ne
89f0: 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20  ed to unref the 
8a00: 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
8a10: 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70  when that.** hap
8a20: 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pens..*/.static 
8a30: 76 6f 69 64 20 70 61 67 65 44 65 73 74 72 75 63  void pageDestruc
8a40: 74 6f 72 28 44 62 50 61 67 65 20 2a 70 44 61 74  tor(DbPage *pDat
8a50: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
8a60: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
8a70: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
8a80: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8a90: 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50  pData);.  if( pP
8aa0: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
8ab0: 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
8ac0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
8ad0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8ae0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8af0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
8b00: 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  Parent ){.      
8b10: 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
8b20: 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
8b30: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
8b40: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
8b50: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8b60: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
8b70: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 6c  t = 0;.      rel
8b80: 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
8b90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
8ba0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
8bb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
8bc0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
8bd0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
8be0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
8bf0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
8c00: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
8c10: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
8c20: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
8c30: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
8c40: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
8c50: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
8c60: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
8c70: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
8c80: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
8c90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
8ca0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
8cb0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
8cc0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
8cd0: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
8ce0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
8cf0: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
8d00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8d10: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
8d20: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
8d30: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
8d40: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
8d50: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
8d60: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
8d70: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
8d80: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8d90: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
8da0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
8db0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
8dc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8dd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8de0: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
8df0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
8e00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
8e10: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
8e20: 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
8e30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
8e40: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
8e50: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
8e60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8e70: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b  qlite3BtreeInvok
8e80: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
8e90: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 29 7b  d *pArg, int n){
8ea0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
8eb0: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
8ec0: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
8ed0: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
8ee0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8ef0: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
8f00: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
8f10: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
8f20: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
8f30: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
8f40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
8f50: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
8f60: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
8f70: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
8f80: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8f90: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
8fa0: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20  me is NULL.** a 
8fb0: 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74  new database wit
8fc0: 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20  h a random name 
8fd0: 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69  is created.  Thi
8fe0: 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64  s randomly named
8ff0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
9000: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
9010: 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  d when sqlite3Bt
9020: 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
9030: 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  lled..** If zFil
9040: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
9050: 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
9060: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
9070: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
9080: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
9090: 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
90a0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
90b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
90c0: 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  reeOpen(.  const
90d0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
90e0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
90f0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
9100: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
9110: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
9120: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
9130: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
9140: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9150: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
9160: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
9170: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
9180: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
9190: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
91a0: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
91b0: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
91c0: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
91d0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
91e0: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
91f0: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
9200: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
9210: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
9220: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
9230: 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 66  The VFS to use f
9240: 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  or this btree */
9250: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
9260: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 68   = 0;      /* Sh
9270: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
9280: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
9290: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
92a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
92b0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
92c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
92d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52 65  TE_OK;.  int nRe
92e0: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
92f0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
9300: 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74  [100];..  /* Set
9310: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
9320: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
9330: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
9340: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
9350: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
9360: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
9370: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
9380: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
9390: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
93a0: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
93b0: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
93c0: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
93d0: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
93e0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
93f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
9400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9410: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
9420: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
9440: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
9450: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
9460: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
9470: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
9480: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
9490: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
94a0: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
94b0: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
94c0: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
94d0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
94e0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
94f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9500: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9510: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
9520: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
9530: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
9540: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
9550: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
9560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9570: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
9580: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
9590: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
95a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
95b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
95c0: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
95d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
95e0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
95f0: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
9600: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
9610: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
9620: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
9630: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
9640: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
9650: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
9660: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
9670: 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26   isMemdb==0.   &
9680: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
9690: 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20  QLITE_Vtab)==0. 
96a0: 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26    && zFilename &
96b0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20  & zFilename[0]. 
96c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
96d0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e  te3SharedCacheEn
96e0: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
96f0: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
9700: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
9710: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
9720: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
9730: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9740: 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (nFullPathname);
9750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9760: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
9770: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
9780: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
9790: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
97a0: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
97b0: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
97c0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
97e0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
97f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9800: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
9810: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
9820: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
9830: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
9840: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
9850: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
9860: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
9870: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
9880: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
9890: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
98a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
98b0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
98c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  ;.      for(pBt=
98d0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
98e0: 68 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74  heList; pBt; pBt
98f0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
9900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
9910: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
9920: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
9930: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
9940: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
9950: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
9960: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
9970: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
9980: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
9990: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
99a0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
99b0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
99c0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
99d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
99e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
99f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9a00: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
9a10: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
9a20: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
9a30: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
9a40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9a50: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
9a60: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
9a70: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
9a80: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
9a90: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
9aa0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
9ab0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
9ac0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
9ad0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
9ae0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
9af0: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
9b00: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
9b10: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
9b20: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
9b30: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
9b40: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
9b50: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
9b60: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
9b70: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
9b80: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
9b90: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
9ba0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
9bb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
9bc0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
9bd0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
9be0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
9bf0: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
9c00: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
9c10: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
9c20: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
9c30: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
9c40: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
9c50: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
9c60: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
9c70: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
9c80: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
9c90: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9ca0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
9cb0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
9cc0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9cd0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
9ce0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
9cf0: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
9d00: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
9d10: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
9d20: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
9d30: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
9d40: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9d50: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
9d60: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
9d70: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9d80: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9d90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9da0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9db0: 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  }.    pBt->busyH
9dc0: 64 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74  dr.xFunc = sqlit
9dd0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
9de0: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42  yHandler;.    pB
9df0: 74 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20  t->busyHdr.pArg 
9e00: 3d 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20  = pBt;.    rc = 
9e10: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
9e20: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
9e30: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger, zFilename, 
9e40: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 2c 0a  pageDestructor,.
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
9e70: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
9e80: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
9e90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9ea0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9eb0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
9ec0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
9ed0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
9ee0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
9ef0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9f00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9f10: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9f20: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9f30: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9f40: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
9f50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9f60: 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20  t->busyHdr);.   
9f70: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
9f80: 20 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33   .    /* sqlite3
9f90: 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
9fa0: 6f 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  or(pBt->pPager, 
9fb0: 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b  pageDestructor);
9fc0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
9fd0: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9fe0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9ff0: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
a000: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
a010: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
a020: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
a030: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
a040: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
a050: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
a060: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
a070: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
a080: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
a090: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
a0a0: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
a0b0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
a0c0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
a0d0: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
a0e0: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
a0f0: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
a100: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
a110: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
a120: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a130: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a140: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
a150: 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ze);.#ifndef SQL
a160: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a170: 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
a180: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
a190: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
a1a0: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
a1b0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
a1c0: 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
a1d0: 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
a1e0: 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
a1f0: 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
a200: 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
a210: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
a220: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
a230: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
a240: 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
a250: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
a260: 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
a270: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
a280: 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
a290: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
a2a0: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
a2b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
a2c0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
a2d0: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
a2e0: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
a2f0: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
a300: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
a310: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
a320: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
a330: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
a340: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
a350: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
a360: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
a370: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
a380: 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
a390: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a3a0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
a3b0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
a3c0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
a3d0: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
a3e0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
a3f0: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
a400: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a410: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
a420: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a430: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
a440: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
a450: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
a460: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
a470: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
a480: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
a490: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
a4a0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73     }.    pBt->us
a4b0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
a4c0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
a4d0: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
a4e0: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
a4f0: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
a500: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
a510: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
a520: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
a530: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
a540: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
a550: 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66  geSize);.   .#if
a560: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a570: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
a580: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
a590: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
a5a0: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
a5b0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
a5c0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
a5d0: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
a5e0: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
a5f0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
a600: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
a610: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
a620: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
a630: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
a640: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
a650: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
a660: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a670: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
a680: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
a690: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a6a0: 45 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66  E && sqlite3Conf
a6b0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
a6c0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
a6d0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
a6e0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
a6f0: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
a700: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
a710: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
a720: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a730: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
a740: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a750: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a760: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a770: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a790: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a7a0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a7b0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
a7c0: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a7d0: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a7e0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a7f0: 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20  heList = pBt;.  
a800: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a810: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
a820: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
a830: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
a840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a850: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
a860: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a870: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a880: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
a890: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
a8a0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
a8b0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
a8c0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
a8d0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
a8e0: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
a8f0: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
a900: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
a910: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
a920: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
a930: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
a940: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
a950: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a960: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
a970: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
a980: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
a9a0: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
a9b0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
a9c0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
a9d0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
a9e0: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
a9f0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
aa00: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
aa10: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
aa20: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
aa30: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
aa40: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
aa50: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
aa60: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
aa70: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
aa80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
aa90: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
aaa0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
aab0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
aac0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
aad0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
aae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aaf0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
ab00: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
ab10: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
ab20: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
ab30: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
ab40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
ab50: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
ab60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab70: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
ab80: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
ab90: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
aba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
abb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
abc0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
abd0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
abe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
abf0: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
ac00: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
ac10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
ac20: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
ac30: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
ac40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
ac50: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
ac60: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
ac70: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
ac80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac90: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
aca0: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
acb0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
acc0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
acd0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
ace0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
acf0: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
ad00: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
ad10: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
ad20: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
ad30: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
ad40: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
ad50: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
ad60: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
ad70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ad80: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
ad90: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
ada0: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
adb0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
adc0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
add0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
ade0: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
adf0: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
ae00: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
ae10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
ae20: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
ae30: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
ae40: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ae50: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ae60: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ae70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae80: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
ae90: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
aea0: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
aeb0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
aec0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
aed0: 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  ist==pBt ){.    
aee0: 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43    sqlite3SharedC
aef0: 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e  acheList = pBt->
af00: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
af10: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
af20: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
af30: 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68  heList;.      wh
af40: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
af50: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
af60: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
af70: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
af80: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
af90: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
afa0: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
afb0: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
afc0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
afd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
afe0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
aff0: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
b000: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
b010: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
b020: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
b030: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
b040: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
b050: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
b060: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
b070: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
b080: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
b090: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
b0a0: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
b0b0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
b0c0: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
b0d0: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
b0e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
b0f0: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
b100: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
b110: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
b120: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
b130: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
b140: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
b150: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
b160: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
b170: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
b180: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
b190: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b1a0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
b1b0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
b1c0: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
b1d0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
b1e0: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
b1f0: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
b200: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
b210: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
b220: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
b230: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
b240: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
b250: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
b260: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b270: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
b280: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
b290: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
b2a0: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
b2b0: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
b2c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b2d0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b2e0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b2f0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b300: 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
b310: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
b320: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
b330: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
b340: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
b350: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
b360: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
b370: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
b380: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
b390: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
b3a0: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
b3b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
b3c0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
b3d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
b3e0: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
b3f0: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
b400: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
b410: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b420: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
b430: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
b440: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
b450: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
b460: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
b470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b480: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
b490: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
b4a0: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
b4b0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
b4c0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
b4d0: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
b4e0: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
b4f0: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
b500: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
b510: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
b520: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
b530: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
b540: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
b550: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
b560: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
b570: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
b580: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
b590: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
b5a0: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
b5b0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
b5c0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
b5d0: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
b5e0: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
b5f0: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
b600: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
b610: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
b620: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
b630: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
b640: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b650: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
b660: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
b670: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
b680: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
b690: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
b6a0: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
b6b0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
b6c0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
b6d0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b6f0: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
b700: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
b710: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
b720: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
b730: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b740: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b750: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
b760: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b770: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b780: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
b790: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
b7a0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b7b0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
b7c0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
b7d0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
b7e0: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
b7f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
b800: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b810: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b820: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
b830: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
b840: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
b850: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
b860: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
b870: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
b880: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
b890: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
b8a0: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
b8b0: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
b8c0: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
b8d0: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
b8e0: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
b8f0: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
b900: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
b910: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
b920: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
b930: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
b940: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
b950: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
b960: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
b970: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
b980: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
b990: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
b9a0: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
b9b0: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
b9c0: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
b9d0: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
b9e0: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
b9f0: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
ba00: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
ba10: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
ba20: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
ba30: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
ba40: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
ba50: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
ba60: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
ba70: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
ba80: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
ba90: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
baa0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
bab0: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
bac0: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
bad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bae0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
baf0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
bb00: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
bb10: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bb20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bb30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bb40: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
bb50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bb60: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
bb70: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
bb80: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
bb90: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
bba0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
bbb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bbc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
bbd0: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
bbe0: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
bbf0: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
bc00: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
bc10: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
bc20: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
bc30: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
bc40: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
bc50: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
bc60: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
bc70: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
bc80: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
bc90: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
bca0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
bcb0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
bcc0: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
bcd0: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
bce0: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
bcf0: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
bd00: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
bd10: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
bd20: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
bd30: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
bd40: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
bd50: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
bd60: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
bd70: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
bd80: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
bd90: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
bda0: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
bdb0: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
bdc0: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
bdd0: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
bde0: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
bdf0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
be00: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
be10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
be20: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
be30: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
be40: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
be50: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
be60: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
be70: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
be80: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
be90: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
bea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
beb0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
bec0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bed0: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
bee0: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
bef0: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
bf00: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
bf10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
bf20: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
bf30: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
bf40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bf50: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
bf60: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
bf70: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
bf80: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
bf90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bfa0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bfb0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
bfc0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bfd0: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
bfe0: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
bff0: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
c000: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
c010: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
c020: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c030: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c040: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
c050: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c060: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c070: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c080: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c090: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
c0a0: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
c0b0: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
c0c0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
c0d0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
c0e0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
c0f0: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
c100: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
c110: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
c120: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
c130: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
c140: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
c150: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
c160: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
c170: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
c180: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
c190: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
c1a0: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
c1b0: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
c1c0: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
c1d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c1e0: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
c1f0: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
c200: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
c210: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
c220: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
c230: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
c240: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
c250: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
c260: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
c270: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
c280: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
c290: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
c2a0: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
c2b0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
c2c0: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
c2d0: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
c2e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c2f0: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
c300: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
c310: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
c320: 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
c330: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c340: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c350: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
c360: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c370: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
c380: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
c390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c3a0: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
c3b0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c3c0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
c3d0: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
c3e0: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
c3f0: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
c400: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
c410: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
c420: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
c430: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
c440: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
c450: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c460: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
c470: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
c480: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
c490: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
c4a0: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
c4b0: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
c4c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
c4d0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
c4e0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
c4f0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c500: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
c510: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
c520: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
c530: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
c540: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
c550: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
c560: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c570: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c580: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c590: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
c5a0: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
c5b0: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
c5c0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c5d0: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
c5e0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
c5f0: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
c600: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c610: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
c620: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
c630: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c640: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
c650: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
c660: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c670: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c680: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c690: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c6a0: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
c6b0: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
c6c0: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
c6d0: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
c6e0: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
c6f0: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
c700: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
c710: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
c720: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
c730: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
c740: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
c750: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
c760: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
c770: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
c780: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
c790: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
c7a0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c7b0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
c7c0: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
c7d0: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
c7e0: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
c7f0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c800: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
c810: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
c820: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c830: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c840: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c850: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
c860: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
c870: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
c880: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
c890: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
c8a0: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
c8b0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c8c0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
c8d0: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
c8e0: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
c8f0: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
c900: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
c910: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
c920: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
c930: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
c940: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
c950: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
c960: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
c970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c980: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
c990: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
c9a0: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
c9b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c9c0: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c9d0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c9e0: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
c9f0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
ca00: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
ca10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61  LITE_OK;.  int a
ca20: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  v = (autoVacuum?
ca30: 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  1:0);..  sqlite3
ca40: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
ca50: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
ca60: 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70  zeFixed && av!=p
ca70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
ca80: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ca90: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
caa0: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
cab0: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20  toVacuum = av;. 
cac0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
cad0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
cae0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
caf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cb00: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
cb10: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
cb20: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
cb30: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
cb40: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
cb50: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
cb60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb70: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
cb80: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
cb90: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cba0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
cbb0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
cbc0: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
cbd0: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
cbe0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
cbf0: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
cc00: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
cc10: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
cc20: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
cc30: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
cc40: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
cc50: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
cc60: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
cc70: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
cc80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
cc90: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
cca0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
ccb0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
ccc0: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
ccd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cce0: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
ccf0: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
cd00: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
cd10: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
cd20: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
cd30: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
cd40: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
cd50: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
cd60: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
cd70: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
cd80: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
cd90: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
cda0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
cdb0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
cdc0: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
cdd0: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
cde0: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
cdf0: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
ce00: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
ce10: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
ce20: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
ce30: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
ce40: 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61  Page1;.  int nPa
ce50: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
ce60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ce70: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ce80: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
ce90: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
cea0: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
ceb0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
cec0: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
ced0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
cee0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
cef0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
cf00: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
cf10: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
cf20: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
cf30: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
cf40: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
cf50: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
cf60: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
cf70: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
cf80: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
cf90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cfa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
cfb0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cfc0: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
cfd0: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
cfe0: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
cff0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
d000: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
d010: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
d020: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d030: 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
d040: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
d050: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
d060: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
d070: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d080: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
d090: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
d0a0: 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
d0b0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
d0c0: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
d0d0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
d0e0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d0f0: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
d100: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
d110: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
d120: 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
d130: 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
d140: 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
d150: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
d160: 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
d170: 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
d180: 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
d190: 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
d1a0: 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
d1b0: 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
d1c0: 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
d1d0: 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
d1e0: 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
d1f0: 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
d200: 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
d210: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
d220: 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
d230: 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
d240: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d250: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d260: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
d270: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
d280: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
d290: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
d2a0: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
d2b0: 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
d2c0: 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
d2d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d2e0: 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
d2f0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
d300: 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
d310: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d320: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d330: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d340: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
d350: 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
d360: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
d370: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
d380: 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
d390: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
d3a0: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
d3b0: 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
d3c0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d3d0: 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
d3e0: 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
d3f0: 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
d400: 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
d410: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
d420: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
d430: 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
d440: 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
d450: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
d460: 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
d470: 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
d480: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
d490: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
d4a0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
d4b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
d4c0: 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
d4d0: 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
d4e0: 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
d4f0: 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
d500: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
d510: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
d520: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
d530: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
d540: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d550: 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
d560: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
d570: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
d580: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
d590: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
d5a0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
d5b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d5c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
d5d0: 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a  ableSize<500 ){.
d5e0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d5f0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d600: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
d610: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d620: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
d630: 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
d640: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
d650: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d660: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
d670: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
d680: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
d690: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
d6a0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
d6b0: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
d6c0: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
d6d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
d6e0: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
d6f0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
d700: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
d710: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
d720: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
d730: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
d740: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
d750: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
d760: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
d770: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
d780: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
d790: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
d7a0: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
d7b0: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
d7c0: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
d7d0: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
d7e0: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
d7f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
d800: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
d810: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
d820: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
d830: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
d840: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
d850: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
d860: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
d870: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
d880: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
d890: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
d8a0: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
d8b0: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
d8c0: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
d8d0: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
d8e0: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
d8f0: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
d900: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
d910: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
d920: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
d930: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
d940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
d950: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
d960: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
d970: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d980: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
d990: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
d9a0: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
d9b0: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
d9c0: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
d9d0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d9e0: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
d9f0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
da00: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
da10: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
da20: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
da30: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
da40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
da50: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
da60: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
da70: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
da80: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
da90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
daa0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
dab0: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
dac0: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
dad0: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
dae0: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
daf0: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
db00: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
db10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
db20: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
db30: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
db40: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
db50: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
db60: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
db70: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
db80: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
db90: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
dba0: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
dbb0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
dbc0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
dbd0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
dbe0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
dbf0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
dc00: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
dc10: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
dc20: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
dc30: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
dc40: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
dc50: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
dc60: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
dc70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dc80: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
dc90: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
dca0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
dcb0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
dcc0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
dcd0: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
dce0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
dcf0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
dd00: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
dd10: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
dd20: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
dd30: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
dd40: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
dd50: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
dd60: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
dd70: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
dd80: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
dd90: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
dda0: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
ddb0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
ddc0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
ddd0: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
dde0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
ddf0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
de00: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
de10: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
de20: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
de30: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
de40: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
de50: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
de60: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
de70: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
de80: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
de90: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
dea0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
deb0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
dec0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
ded0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
dee0: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
def0: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
df00: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
df10: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
df20: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
df30: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
df40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
df50: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
df60: 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  a );.#if 0.     
df70: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
df80: 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
df90: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
dfa0: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
dfb0: 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e1;.        pPag
dfc0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
dfd0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
dfe0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
dff0: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
e000: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
e010: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
e020: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  1;.      }.#endi
e030: 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  f.      releaseP
e040: 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
e050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
e060: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
e070: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
e080: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
e090: 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
e0a0: 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
e0b0: 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
e0c0: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
e0d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e0e0: 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
e0f0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
e100: 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
e110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
e120: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
e130: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
e140: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e150: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e160: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
e170: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e180: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
e190: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
e1a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e1b0: 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
e1c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e1d0: 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
e1e0: 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
e1f0: 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
e200: 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
e210: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e220: 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
e230: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
e240: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
e250: 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
e260: 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
e270: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
e280: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
e290: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
e2a0: 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
e2b0: 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
e2c0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
e2d0: 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
e2e0: 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64  ata[19] = 1;.  d
e2f0: 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70  ata[20] = pBt->p
e300: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
e310: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
e320: 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
e330: 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
e340: 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
e350: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
e360: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
e370: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
e380: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
e390: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
e3a0: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
e3b0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
e3c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e3d0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
e3e0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
e3f0: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
e400: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
e410: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
e420: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
e430: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e440: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
e450: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
e460: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
e470: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
e480: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
e490: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e4a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
e4b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e4c0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
e4d0: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
e4e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
e4f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
e500: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
e510: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e520: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
e530: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
e540: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
e550: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
e560: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
e570: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
e580: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
e590: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
e5a0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
e5b0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
e5c0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
e5d0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
e5e0: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
e5f0: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
e600: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
e610: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
e620: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
e630: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
e640: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
e650: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
e660: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
e670: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
e680: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
e690: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
e6a0: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
e6b0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
e6c0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
e6d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
e6e0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
e6f0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e700: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
e710: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
e720: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
e730: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
e740: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e750: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
e760: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e770: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
e780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e790: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
e7a0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e7b0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
e7c0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e7d0: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e7e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e7f0: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e800: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e810: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e820: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e830: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e840: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e850: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e860: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e870: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e880: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e890: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e8a0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e8b0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e8c0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e8d0: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e8e0: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e8f0: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e900: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e910: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e920: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e930: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e940: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e950: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e960: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e970: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e980: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e990: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e9a0: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e9b0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e9c0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e9d0: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e9e0: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e9f0: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
ea00: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
ea10: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
ea20: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
ea30: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
ea40: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
ea50: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
ea60: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
ea70: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
ea80: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
ea90: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
eaa0: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
eab0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
eac0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
ead0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
eae0: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
eaf0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
eb00: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
eb10: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
eb20: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
eb30: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
eb40: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
eb50: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
eb60: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
eb70: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
eb80: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
eb90: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
eba0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
ebb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
ebc0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ebd0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
ebe0: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
ebf0: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
ec00: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
ec10: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
ec20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
ec30: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
ec40: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
ec50: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
ec60: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
ec70: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
ec80: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
ec90: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
eca0: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
ecb0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
ecc0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
ecd0: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
ece0: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
ecf0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
ed00: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
ed10: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
ed20: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
ed30: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
ed40: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
ed50: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
ed60: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
ed70: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ed80: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
ed90: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
eda0: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
edb0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
edc0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
edd0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
ede0: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
edf0: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
ee00: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
ee10: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
ee20: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
ee30: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
ee40: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
ee50: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
ee60: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
ee70: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
ee80: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
ee90: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
eea0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
eeb0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
eec0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
eed0: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
eee0: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
eef0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
ef00: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
ef10: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
ef20: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
ef30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
ef40: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
ef50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ef60: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
ef70: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
ef80: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
ef90: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
efa0: 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74  do {.    if( pBt
efb0: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
efc0: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
efd0: 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28   rc = lockBtree(
efe0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  pBt);.      }whi
eff0: 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
f000: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
f010: 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  _OK );.    }..  
f020: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f030: 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
f040: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
f050: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
f060: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f070: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
f080: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
f090: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f0a0: 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
f0b0: 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c  1->pDbPage, wrfl
f0c0: 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ag>1);.        i
f0d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f0e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f0f0: 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
f100: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
f110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
f120: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
f140: 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d  f( wrflag ) pBt-
f150: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
f160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
f170: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
f180: 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
f190: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
f1a0: 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
f1b0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
f1c0: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
f1d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
f1e0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f1f0: 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a  dler(pBt, 0) );.
f200: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f210: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f220: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
f230: 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
f240: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
f250: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n++;.    }.    p
f260: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
f270: 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
f280: 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
f290: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
f2a0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f2b0: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
f2c0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
f2d0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
f2e0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f2f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f300: 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c  CHE.    if( wrfl
f310: 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73  ag>1 ){.      as
f320: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63  sert( !pBt->pExc
f330: 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20  lusive );.      
f340: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
f350: 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = p;.    }.#endi
f360: 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
f370: 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65  gun:.  btreeInte
f380: 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
f390: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f3a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f3b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f3c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
f3d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
f3e0: 70 61 67 65 73 2e 20 20 4f 72 20 72 65 74 75 72  pages.  Or retur
f3f0: 6e 20 2d 31 20 69 66 0a 2a 2a 20 74 68 65 72 65  n -1 if.** there
f400: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
f410: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
f420: 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
f430: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
f440: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
f450: 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72 63 20  int nPage;.  rc 
f460: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
f470: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
f480: 26 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  &nPage);.  retur
f490: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
f4a0: 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 0a  ?nPage:-1);.}...
f4b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f4c0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
f4d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
f4e0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
f4f0: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
f500: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
f510: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
f520: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
f530: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
f540: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
f550: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
f560: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
f570: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
f580: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
f590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
f5a0: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
f5b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
f5c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
f5f0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
f600: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
f630: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
f640: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f670: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
f680: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
f690: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
f6a0: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
f6b0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
f6c0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
f6d0: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
f6e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f6f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f700: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
f710: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
f720: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
f730: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
f740: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f750: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
f760: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f770: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
f780: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
f790: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f7a0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
f7b0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f7c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f7d0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
f7e0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
f7f0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
f800: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f810: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
f820: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f830: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
f840: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f850: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
f860: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f870: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
f880: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
f890: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
f8a0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
f8b0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 69 66 28  gno);.       if(
f8c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f8d0: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
f8e0: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
f8f0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
f900: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f910: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
f920: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
f930: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
f940: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
f950: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f960: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
f970: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
f980: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
f990: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f9a0: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
f9b0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f9c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f9d0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
f9e0: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
f9f0: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
fa00: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
fa10: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
fa20: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
fa30: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
fa40: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
fa50: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
fa60: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
fa70: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
fa80: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
fa90: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
faa0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
fab0: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
fac0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
fad0: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
fae0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
faf0: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
fb00: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
fb10: 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
fb20: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
fb30: 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
fb40: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
fb50: 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
fb60: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
fb70: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
fb80: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fba0: 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
fbb0: 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
fbc0: 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
fbd0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
fbe0: 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
fbf0: 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
fc00: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fc10: 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
fc20: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fc30: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
fc40: 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
fc50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
fc60: 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
fc70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
fc80: 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
fc90: 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
fca0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fcb0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fcc0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fcd0: 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
fce0: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
fcf0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
fd00: 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
fd10: 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
fd20: 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
fd30: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
fd40: 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
fd50: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
fd60: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fd80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
fd90: 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
fda0: 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
fdb0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
fdc0: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
fdd0: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
fde0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fdf0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
fe00: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
fe10: 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  Page(pPage, 0);.
fe20: 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
fe30: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
fe40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
fe50: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
fe60: 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
fe70: 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
fe80: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
fe90: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
fea0: 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
feb0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
fec0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
fed0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
fee0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
fef0: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
ff00: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
ff10: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
ff20: 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
ff30: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
ff40: 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
ff50: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
ff60: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
ff70: 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
ff80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ff90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ffa0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ffb0: 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
ffc0: 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
ffd0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
ffe0: 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
fff0: 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
10000 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10020 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
10030 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
10040 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
10050 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
10060 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
10070 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
10080 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
10090 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
100a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
100b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
100c0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
100d0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
100e0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
100f0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
10100 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
10110 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
10120 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
10130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
10140 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
10150 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
10160 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
10170 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
10180 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
10190 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
101a0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
101b0 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
101c0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
101d0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
101e0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
101f0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
10200 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
10210 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
10220 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
10230 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
10240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10250 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
10260 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
10270 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
10280 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
10290 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
102a0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
102b0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
102c0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
102d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
102e0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
102f0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
10300 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b   int isCommit.){
10310 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
10320 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
10330 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10340 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
10350 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
10360 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
10370 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
10380 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
10390 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
103a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
103b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
103c0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
103d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
103e0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
103f0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
10400 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
10410 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
10420 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10430 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10440 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10450 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
10460 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
10470 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
10480 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
10490 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
104a0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
104b0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
104c0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
104d0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
104e0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
104f0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
10500 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
10510 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
10520 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
10530 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10540 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
10550 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
10560 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
10570 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
10580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10590 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
105a0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
105b0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
105c0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
105d0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
105e0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
105f0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
10600 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
10610 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
10620 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
10630 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
10640 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
10650 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
10660 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
10670 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
10680 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
10690 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
106a0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
106b0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
106c0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
106d0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
106e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
106f0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
10700 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
10710 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
10720 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
10730 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
10740 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
10750 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
10760 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
10770 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
10780 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10790 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
107a0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
107b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
107c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
107d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
107e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
107f0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
10800 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
10810 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
10820 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
10830 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
10840 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
10850 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
10860 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
10870 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10890 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
108a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
108b0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
108c0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
108d0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
108e0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
108f0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
10900 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
10910 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
10920 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
10930 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
10940 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
10950 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
10960 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
10970 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
10980 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10990 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
109a0 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
109b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
109c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
109d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
109e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
109f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
10a00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
10a10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10a20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10a30 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
10a40 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
10a50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10a60 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
10a70 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
10a80 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
10a90 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
10aa0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
10ab0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10ad0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
10ae0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
10af0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
10b00 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
10b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10b20 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
10b30 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
10b40 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
10b50 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
10b60 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
10b70 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
10b80 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
10b90 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
10ba0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
10bb0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
10bc0 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
10bd0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
10be0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
10bf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
10c00 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
10c10 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
10c20 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
10c30 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
10c40 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
10c50 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
10c60 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
10c70 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
10c80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
10c90 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
10ca0 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
10cb0 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
10cc0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
10cd0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
10ce0 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
10cf0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
10d00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
10d10 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
10d20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
10d30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
10d40 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
10d50 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
10d60 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
10d70 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
10d80 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
10d90 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10da0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
10db0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
10dc0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10de0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
10df0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
10e00 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
10e10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10e20 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
10e30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
10e40 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e  gno nFin){.  Pgn
10e50 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20  o iLastPg;      
10e60 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
10e70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
10e80 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  ase */.  Pgno nF
10e90 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
10ea0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10eb0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
10ec0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
10ed0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10ee0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10ef0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10f00 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54  LastPg = pBt->nT
10f10 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73  runc;.  if( iLas
10f20 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  tPg==0 ){.    iL
10f30 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67  astPg = pagerPag
10f40 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10f50 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
10f60 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
10f70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
10f80 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
10f90 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10fa0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
10fb0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
10fc0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
10fd0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
10fe0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
10ff0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11000 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
11010 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e  eList==0 || nFin
11020 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20  ==iLastPg ){.   
11030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11040 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
11050 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
11060 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
11070 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
11080 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
110a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
110b0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
110c0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
110d0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
110e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
110f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
11100 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
11110 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
11120 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
11130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
11140 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
11150 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
11160 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
11170 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
11180 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
11190 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
111a0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
111b0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
111c0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
111d0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
111e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
111f0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
11200 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
11210 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
11220 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
11230 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
11240 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
11250 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
11260 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
11270 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
11280 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
11290 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
112a0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
112b0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
112c0 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
112d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
112e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
112f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
11300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
11310 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
11320 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
11330 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
11340 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
11350 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11360 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
11370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11380 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
11390 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
113a0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
113b0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
113c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
113d0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
113e0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
113f0 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
11400 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
11420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11430 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
11440 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
11450 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
11460 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
11470 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
11480 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
11490 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
114a0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
114b0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
114c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
114d0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
114e0 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
114f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
11500 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
11510 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
11520 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
11530 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
11540 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
11550 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
11560 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
11570 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
11580 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
11590 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
115a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
115b0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
115c0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
115d0 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
115e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
115f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11600 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
11610 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
11620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11630 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11640 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11650 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
11660 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
11670 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
11680 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11690 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
116a0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
116b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
116c0 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
116d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
116e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
116f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
11700 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
11710 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
11720 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
11730 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30  iFreePg, nFin!=0
11740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11750 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
11760 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
11770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11780 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11790 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
117a0 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e   }.  }..  pBt->n
117b0 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67 20  Trunc = iLastPg 
117c0 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 42  - 1;.  while( pB
117d0 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49  t->nTrunc==PENDI
117e0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
117f0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
11800 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e  (pBt, pBt->nTrun
11810 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e  c) ){.    pBt->n
11820 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Trunc--;.  }.  r
11830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
11850 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
11860 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
11870 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
11880 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
11890 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
118a0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
118b0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
118c0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
118d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
118e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
118f0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
11900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
11910 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
11920 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
11930 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
11940 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
11950 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  o error occured,
11960 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
11970 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11980 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
11990 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
119a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
119b0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
119c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
119d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
119e0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
119f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11a00 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
11a10 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
11a20 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11a30 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
11a40 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
11a50 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
11a60 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
11a70 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
11a80 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
11a90 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
11aa0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
11ab0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
11ac0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11ad0 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
11ae0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11af0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11b00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11b20 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
11b30 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
11b40 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11b50 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
11b60 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
11b70 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
11b80 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
11b90 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
11ba0 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
11bb0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
11bc0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
11bd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11be0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
11bf0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
11c00 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
11c10 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
11c20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
11c30 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
11c40 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
11c50 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
11c60 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
11c70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11c80 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
11c90 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
11ca0 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
11cb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11cc0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
11cd0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
11ce0 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
11cf0 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
11d00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
11d10 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
11d20 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11d30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11d40 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11d50 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
11d60 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
11d70 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
11d80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
11d90 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
11da0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
11db0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
11dc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
11dd0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
11de0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
11df0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
11e00 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
11e10 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
11e20 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Size;.      int 
11e30 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
11e40 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
11e50 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  er);..      if( 
11e60 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11e70 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
11e80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11e90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11ea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11eb0 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
11ec0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69   ){.        nOri
11ee0 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
11ef0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
11f00 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11f10 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
11f20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
11f30 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
11f40 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
11f50 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
11f60 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69  sz/5);.      nFi
11f70 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
11f80 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
11f90 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
11fa0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11fb0 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
11fc0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11fd0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
11fe0 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
11ff0 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d       while( PTRM
12000 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
12010 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
12020 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
12030 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
12040 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
12050 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
12060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12070 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
12080 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
12090 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
120a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
120b0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
120c0 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c  assert(nFin==0 |
120d0 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  | pBt->nTrunc==0
120e0 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e   || nFin<=pBt->n
120f0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63  Trunc);.      rc
12100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12110 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
12120 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b 0a 20  unc && nFin ){. 
12130 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12140 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
12150 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
12160 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
12170 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12180 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
12190 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
121a0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
121b0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
121c0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  .        pBt->nT
121d0 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  runc = nFin;.   
121e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
121f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12200 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12210 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
12220 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
12230 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
12240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
12250 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54  nTrunc = pBt->nT
12260 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  runc;.    pBt->n
12270 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunc = 0;.  }. 
12280 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
12290 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
122a0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
122b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
122c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
122d0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
122e0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
122f0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
12300 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
12310 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
12320 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12330 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
12340 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
12350 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
12360 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
12370 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
12380 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
12390 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
123a0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
123b0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
123c0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
123d0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
123e0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
123f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
12400 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
12410 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
12420 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
12430 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
12440 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
12450 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
12460 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
12470 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
12480 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
12490 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
124a0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
124b0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
124c0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
124d0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
124e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
124f0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
12500 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
12510 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
12520 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
12530 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12540 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
12550 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
12560 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
12570 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
12580 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
12590 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
125a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
125b0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
125c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
125d0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
125e0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
125f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
12600 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
12610 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
12620 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
12630 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
12640 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
12650 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12660 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12670 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
12680 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
12690 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
126a0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
126b0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
126c0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
126d0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
126e0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
126f0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
12700 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
12710 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
12720 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
12730 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
12740 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12750 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
12760 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
12770 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
12780 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
12790 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
127a0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
127b0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
127c0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
127d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
127e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
127f0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
12800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
12810 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12820 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
12830 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
12840 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
12850 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12860 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
12870 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
12880 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
12890 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
128a0 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
128b0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nc = 0;.    sqli
128c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
128d0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
128e0 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
128f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12900 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
12910 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
12920 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
12930 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
12940 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20  , &nTrunc); .   
12950 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12970 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12980 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
12990 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
129a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
129b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
129c0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
129d0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
129e0 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20  Master, nTrunc, 
129f0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
12a00 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12a10 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12a20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
12a30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
12a40 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
12a50 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
12a60 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
12a70 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
12a80 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
12a90 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
12aa0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  * sqlite3BtreeSy
12ab0 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  nc() routine doe
12ac0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
12ad0 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  e and should be 
12ae0 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72  invoked.** prior
12af0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
12b00 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
12b10 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12b20 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a  ) routine did.**
12b30 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
12b40 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
12b50 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
12b60 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
12b70 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
12b80 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
12b90 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
12ba0 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
12bb0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
12bc0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
12bd0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
12be0 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  te the rollback 
12bf0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63  journal.** (whic
12c00 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
12c10 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
12c20 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63  it) and drop loc
12c30 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
12c40 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
12c50 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
12c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
12c70 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
12c80 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
12c90 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
12ca0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
12cb0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
12cc0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12cd0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
12ce0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12cf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
12d00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d10 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
12d20 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
12d30 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
12d40 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
12d50 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
12d60 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
12d70 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
12d80 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
12d90 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
12da0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
12db0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
12dc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12dd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12de0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
12df0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
12e00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12e10 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
12e20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12e30 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
12e40 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
12e50 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
12e60 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
12e70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
12e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
12ea0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
12eb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12ec0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
12ed0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
12ee0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74  NS_READ;.    pBt
12ef0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
12f00 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  }.  unlockAllTab
12f10 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  les(p);..  /* If
12f20 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
12f30 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
12f40 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
12f50 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
12f60 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
12f70 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
12f80 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
12f90 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
12fa0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
12fb0 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
12fc0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12fd0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
12fe0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
12ff0 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
13000 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
13010 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
13020 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
13030 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  NS_NONE ){.    p
13040 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
13050 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
13060 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
13070 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
13080 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
13090 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
130a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
130b0 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
130c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
130d0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
130e0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
130f0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
13100 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
13110 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
13120 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
13130 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ion..  */.  p->i
13140 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
13150 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ONE;.  unlockBtr
13160 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
13170 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
13180 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
13190 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
131a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
131b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
131c0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
131d0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
131e0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
131f0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
13200 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
13210 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13230 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
13240 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
13250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13270 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
13280 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wo(p);.  }.  sql
13290 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
132a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
132b0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
132c0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
132d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
132e0 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
132f0 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
13300 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
13310 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
13320 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
13330 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
13340 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
13350 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
13360 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
13370 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
13380 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d  outine, a write-
13390 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
133a0 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
133b0 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69  capable of writi
133c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73  ng to the databs
133d0 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  e.  That means t
133e0 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
133f0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
13400 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ed for writing a
13410 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  nd the cursor ha
13420 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65  s not be disable
13430 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69  d.** by having i
13440 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64  ts state changed
13450 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
13460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13470 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
13480 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
13490 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
134a0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
134b0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
134c0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
134d0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
134e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
134f0 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d  >wrFlag && pCur-
13500 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
13510 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
13520 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
13530 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
13540 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
13550 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
13560 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
13570 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
13580 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
13590 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42  very cursor on B
135a0 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
135b0 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
135c0 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  s..**.** Every c
135d0 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64  ursor is tripped
135e0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
135f0 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a  ors that belong.
13600 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ** to other data
13610 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
13620 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
13630 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68  be sharing.** th
13640 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
13650 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
13660 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
13670 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
13680 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41  ack occurs..** A
13690 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67  ll cursors using
136a0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20   the same cache 
136b0 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a  must be tripped.
136c0 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
136d0 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  em from trying t
136e0 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20  o use the btree 
136f0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c  after.** the rol
13700 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c  lback.  The roll
13710 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
13720 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20  leted tables.** 
13730 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61  or moved root pa
13740 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f  ges, so it is no
13750 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a  t sufficient to.
13760 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74  ** save the stat
13770 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
13780 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
13790 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  t be.** invalida
137a0 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
137b0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
137c0 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
137d0 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
137e0 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
137f0 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
13800 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
13810 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
13820 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
13830 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
13840 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
13850 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70  sition(p);.    p
13860 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
13870 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
13880 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
13890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
138a0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
138b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
138c0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
138d0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
138e0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
138f0 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
13900 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
13910 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
13920 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
13930 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
13940 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
13950 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
13960 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
13970 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
13980 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
13990 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
139a0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
139b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
139c0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
139d0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
139e0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
139f0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
13a00 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
13a10 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
13a20 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a30 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a40 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13a50 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
13a60 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
13a70 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
13a80 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
13a90 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
13aa0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
13ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ac0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
13af0 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
13b00 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
13b10 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
13b20 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
13b30 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
13b40 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
13b50 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
13b60 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
13b70 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
13b80 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
13b90 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
13ba0 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
13bb0 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
13bc0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
13bd0 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
13be0 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
13bf0 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
13c00 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
13c10 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
13c20 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
13c30 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
13c40 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
13c50 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
13c60 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
13c70 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
13c80 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
13c90 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
13ca0 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
13cb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13cc0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
13cd0 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , rc);.  }.#endi
13ce0 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
13cf0 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
13d00 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
13d10 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13d20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
13d30 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66     int rc2;..#if
13d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13d60 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
13d70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
13d80 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
13d90 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
13da0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
13db0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
13dc0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
13dd0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
13de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13df0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
13e00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13e10 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
13e20 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
13e30 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
13e40 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
13e50 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
13e60 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
13e70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
13e80 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
13e90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
13ea0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13eb0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13ec0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13ed0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13ee0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
13ef0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13f00 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13f10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
13f20 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
13f30 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
13f40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13f50 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
13f60 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
13f70 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
13f80 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
13f90 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13fa0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
13fb0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
13fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
13fd0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
13fe0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13ff0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
14000 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
14010 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
14020 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14030 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14040 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14050 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
14060 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14070 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14080 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
140a0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
140b0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
140c0 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73  n.  The subtrans
140d0 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61  action can.** ca
140e0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
140f0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
14100 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
14110 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d  action..** You m
14120 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
14130 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73  saction before s
14140 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
14150 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
14160 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14170 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
14180 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61  ically if the ma
14190 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  in transaction.*
141a0 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  * commits or rol
141b0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  ls back..**.** O
141c0 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73  nly one subtrans
141d0 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
141e0 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20  tive at a time. 
141f0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
14200 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61  to try.** to sta
14210 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e  rt a new subtran
14220 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68  saction if anoth
14230 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  er subtransactio
14240 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
14250 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ive..**.** State
14260 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
14270 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
14280 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
14290 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
142a0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
142b0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
142c0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
142d0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
142e0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
142f0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
14300 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
14310 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
14320 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
14330 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
14340 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14350 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
14360 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
14370 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
14380 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
14390 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
143a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
143b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
143c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
143d0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
143e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
143f0 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
14400 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14410 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
14420 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
14430 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
14440 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
14450 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
14460 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14470 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14480 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
14490 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
144a0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
144b0 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
144c0 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
144d0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
144e0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
144f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14500 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14510 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14520 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
14530 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14540 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
14550 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
14560 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
14570 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
14580 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
14590 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
145a0 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
145b0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
145c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
145e0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
145f0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
14600 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74  p->db;.  if( pBt
14610 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
14620 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14640 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
14650 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
14660 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
14670 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14680 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
14690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
146a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
146b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
146c0 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
146d0 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
146e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
146f0 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
14700 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
14710 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14720 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
14730 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
14740 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
14750 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
14760 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
14770 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
14780 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
14790 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
147a0 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
147b0 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
147c0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
147d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
147e0 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
147f0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
14800 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14810 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14820 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
14830 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14840 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14850 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
14860 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
14870 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
14880 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14890 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
148a0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
148b0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
148c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
148d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
148e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
148f0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
14900 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
14910 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
14920 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
14930 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
14940 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
14950 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
14960 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
14970 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14980 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
14990 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
149a0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
149b0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
149c0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
149d0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
149e0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
149f0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
14a00 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
14a10 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
14a20 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
14a30 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
14a40 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
14a50 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
14a60 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
14a70 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
14a80 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
14a90 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
14aa0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
14ab0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
14ac0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
14ad0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
14ae0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14af0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
14b00 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
14b10 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
14b20 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
14b30 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
14b40 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
14b50 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
14b60 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
14b70 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
14b80 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
14b90 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
14ba0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
14bb0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
14bc0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
14bd0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
14be0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
14bf0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
14c00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14c10 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
14c20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
14c30 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
14c40 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
14c50 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
14c60 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
14c70 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
14c80 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
14c90 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
14ca0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
14cb0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
14cc0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
14cd0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
14ce0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
14cf0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14d00 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
14d10 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
14d20 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
14d30 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
14d40 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14d70 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
14d80 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
14db0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
14dc0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
14dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14df0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
14e00 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
14e10 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
14e20 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
14e30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
14e40 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
14e50 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
14e60 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e80 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
14e90 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
14ea0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14eb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14ec0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
14ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
14ee0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
14ef0 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
14f00 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
14f10 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nly ){.      ret
14f20 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
14f30 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
14f40 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
14f50 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
14f60 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
14f70 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
14f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
14f90 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
14fa0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
14fb0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
14fc0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
14fd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14fe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14ff0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
15000 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
15010 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65  Flag ){.      re
15020 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
15030 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
15040 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
15050 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
15060 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
15070 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75   && pagerPagecou
15080 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
15090 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
150a0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
150b0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
150c0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
150d0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
150e0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
150f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
15100 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a  Cur->pPage, 0);.
15110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15120 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
15130 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
15140 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
15150 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
15160 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
15170 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
15180 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
15190 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
151a0 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
151b0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
151c0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
151d0 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
151e0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
151f0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
15200 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
15210 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
15220 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
15230 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
15240 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
15250 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
15260 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
15270 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
15280 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
15290 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
152a0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
152b0 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
152c0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
152d0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
152e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
152f0 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75  INVALID;..  retu
15300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
15310 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
15320 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73  eption:.  releas
15330 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
15340 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  e);.  unlockBtre
15350 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
15370 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15380 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
15390 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
153c0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
153d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153f0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
15400 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
15410 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
15420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
15450 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
15460 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
15470 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15490 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
154a0 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
154b0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
154e0 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
154f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
15500 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
15510 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
15520 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
15530 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
15540 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
15550 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
15560 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
15570 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
15590 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
155a0 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72  ursorSize(){.  r
155b0 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
155c0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ursor);.}..../*.
155d0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
155e0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
155f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15600 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
15610 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
15620 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
15630 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
15640 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15650 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
15660 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
15670 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
15680 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
15690 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ee ){.    BtShar
156a0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
156b0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
156c0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
156d0 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  e);.    pBt->db 
156e0 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
156f0 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73    clearCursorPos
15700 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
15710 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
15720 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
15730 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
15740 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
15760 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
15770 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
15780 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
15790 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
157a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
157b0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
157c0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
157d0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
157e0 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
157f0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15800 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
15810 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
15820 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
15830 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
15840 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15850 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
15860 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15880 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
15890 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
158a0 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
158b0 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
158c0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
158d0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
158e0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
158f0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
15900 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15910 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
15920 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
15930 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
15940 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
15950 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15960 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
15970 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
15980 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ur, sizeof(*pCur
15990 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
159a0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
159b0 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
159c0 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72  ;.  if( pTempCur
159d0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73  ->pPage ){.    s
159e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
159f0 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  TempCur->pPage->
15a00 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
15a10 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
15a20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15a30 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64   such as was mad
15a40 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54  e by the CreateT
15a50 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29  emporaryCursor()
15a60 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  .** function abo
15a70 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
15a80 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
15a90 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
15aa0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
15ab0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
15ac0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
15ad0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
15ae0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
15af0 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e  agerUnref(pCur->
15b00 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
15b10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
15b20 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
15b30 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
15b40 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
15b50 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
15b60 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
15b70 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
15b80 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
15b90 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
15ba0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
15bb0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
15bc0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
15bd0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
15be0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
15bf0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
15c00 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
15c10 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
15c20 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
15c30 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
15c40 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15c50 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
15c60 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
15c70 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
15c80 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
15c90 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
15ca0 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
15cb0 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
15cc0 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
15cd0 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
15ce0 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
15cf0 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
15d00 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
15d10 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
15d20 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
15d30 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
15d40 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
15d50 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
15d60 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
15d70 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
15d80 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65   doing agressive
15d90 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
15da0 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
15db0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
15dc0 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
15dd0 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
15de0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
15df0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
15e00 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
15e10 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
15e20 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
15e30 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
15e40 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
15e50 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
15e60 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
15e70 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15e80 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
15e90 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66   pCur->idx, &inf
15ea0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
15eb0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
15ec0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
15ed0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
15ee0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
15ef0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
15f00 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
15f10 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
15f20 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
15f30 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
15f40 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
15f50 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
15f60 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
15f70 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
15f80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15f90 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
15fa0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
15fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15fc0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
15fd0 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
15fe0 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dx, &pCur->info)
15ff0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
16000 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
16010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16020 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
16030 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
16040 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
16050 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
16060 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
16070 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
16080 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
16090 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
160a0 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
160b0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
160f0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
16100 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
16140 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
16150 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
16160 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
16170 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
16180 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
16190 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
161d0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
16220 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16260 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
16270 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
16280 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
16290 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
162a0 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
162b0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
162c0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
162d0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
162e0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
162f0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
16300 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
16310 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
16320 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
16330 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
16340 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
16350 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
16360 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
16370 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
16380 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
16390 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
163a0 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
163b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
163c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
163d0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
163e0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
163f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
16400 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
16410 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
16420 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
16430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
16450 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
16460 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16470 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
16480 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16490 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
164a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
164b0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
164c0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
164d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
164e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
164f0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
16500 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
16510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16530 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
16540 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16550 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
16560 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
16570 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
16580 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
16590 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
165a0 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
165b0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
165c0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
165d0 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
165e0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
165f0 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
16600 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
16610 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
16620 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
16630 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
16640 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
16650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16660 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
16670 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
16680 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
16690 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
166a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
166b0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
166c0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
166d0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
166e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
166f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
16700 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16710 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16720 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16730 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16740 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
16750 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16760 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
16770 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
16780 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
16790 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
167a0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
167b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167c0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
167d0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
167e0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
167f0 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
16800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16810 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
16820 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16830 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
16840 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16850 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
16860 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
16870 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
16880 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16890 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
168a0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
168b0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
168c0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
168d0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
168e0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
168f0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
16900 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
16910 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16920 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
16930 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
16940 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
16950 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16960 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
16970 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
16980 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78   Unless pPgnoNex
16990 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70  t is NULL, the p
169a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
169b0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
169c0 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
169d0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77  linked list is w
169e0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
169f0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
16a00 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  fl.** is the las
16a10 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
16a20 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
16a30 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
16a40 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
16a50 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
16a60 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
16a70 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
16a80 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
16a90 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
16aa0 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
16ab0 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
16ac0 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
16ad0 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
16ae0 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
16af0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
16b00 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
16b10 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
16b20 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
16b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
16b40 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
16b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16b60 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
16b90 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
16ba0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
16bb0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
16bc0 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
16bd0 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16bf0 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
16c00 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
16c10 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
16c20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
16c30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16c40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
16c50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
16c60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d  * One of these m
16c70 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
16c80 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20   Otherwise, why 
16c90 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
16ca0 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on? */.  assert(
16cb0 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e  ppPage || pPgnoN
16cc0 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ext);..  /* If p
16cd0 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16ce0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
16cf0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
16d00 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20  lled to obtain. 
16d10 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72   ** a MemPage* r
16d20 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e  eference only. N
16d30 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72  o page-data is r
16d40 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20  equired in this 
16d50 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
16d60 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20   !pPgnoNext ){. 
16d70 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
16d80 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
16d90 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c  t, ovfl, ppPage,
16da0 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   1);.  }..#ifnde
16db0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16dc0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
16dd0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
16de0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
16df0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
16e00 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
16e10 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
16e20 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
16e30 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
16e40 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
16e50 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
16e60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
16e70 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
16e80 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
16e90 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
16ea0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
16eb0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
16ec0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
16ed0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
16ee0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
16ef0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
16f00 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
16f10 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
16f20 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
16f30 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
16f40 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
16f50 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
16f60 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16f70 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
16f80 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
16f90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16fa0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
16fb0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
16fc0 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
16fd0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
16fe0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
16ff0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
17000 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
17010 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
17020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17030 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17040 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17050 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17060 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
17070 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
17080 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
17090 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
170a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
170b0 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
170c0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
170d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
170e0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
170f0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
17100 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
17110 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20  ge, next!=0);.  
17120 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
17130 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
17140 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
17150 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
17160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
17170 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
17180 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
17190 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50    }..    if( ppP
171a0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  age ){.      *pp
171b0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
171c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
171d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
171e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
171f0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
17200 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
17210 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
17220 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
17230 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
17240 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
17250 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
17260 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
17270 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
17280 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
17290 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
172a0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
172b0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
172c0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
172d0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
172e0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
172f0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
17300 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
17310 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
17320 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
17330 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
17340 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
17350 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
17360 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
17370 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
17380 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
17390 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
173a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
173b0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
173c0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
173d0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
173e0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
173f0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
17400 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
17410 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17420 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
17430 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
17440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17450 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
17460 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
17470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17480 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17490 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
174a0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
174b0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
174c0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
174d0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
174e0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
174f0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
17500 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
17510 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
17520 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
17530 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
17540 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
17550 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
17560 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
17570 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
17580 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
17590 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
175a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
175b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
175c0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
175d0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
175e0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
175f0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
17600 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
17610 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
17620 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
17630 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
17640 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
17650 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17660 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17680 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
17690 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
176a0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
176b0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
176c0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
176d0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
176e0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
176f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
17700 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
17710 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
17720 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
17730 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
17740 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
17750 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
17760 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
17770 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
17780 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
17790 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
177a0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
177b0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
177c0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
177d0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
177e0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
177f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17800 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
17810 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
17820 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
17830 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
17840 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
17850 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
17860 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
17870 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
17880 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
17890 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
178a0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
178b0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
178c0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
178d0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
178e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
178f0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
17900 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
17910 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
17920 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
17930 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
17940 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
17950 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
17960 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
17970 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
17980 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
17990 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
179a0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
179b0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
179c0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
179d0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
179e0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
179f0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
17a00 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
17a10 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
17a20 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17a30 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
17a40 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
17a50 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
17a60 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
17a70 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
17a80 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
17a90 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
17aa0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
17ab0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
17ac0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
17ad0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
17ae0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
17af0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
17b00 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
17b10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17b20 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
17b30 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
17b40 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
17b50 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
17b60 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
17b70 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
17b80 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
17b90 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
17ba0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
17bb0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
17bc0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
17bd0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
17be0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
17bf0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
17c00 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
17c10 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
17c20 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
17c30 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
17c40 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
17c50 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
17c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17c70 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
17c80 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
17c90 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
17ca0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
17cb0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
17cc0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
17cd0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
17ce0 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
17cf0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
17d00 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
17d10 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
17d20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
17d30 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
17d40 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
17d50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
17d60 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
17d70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17d80 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
17d90 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
17da0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
17db0 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  ->pPage;     /* 
17dc0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
17dd0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
17de0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
17df0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
17e00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
17e10 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
17e20 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
17e30 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
17e40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17e50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
17e60 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
17e70 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
17e80 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
17e90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
17ea0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
17eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
17ec0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
17ed0 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
17ee0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
17ef0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
17f00 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
17f10 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
17f20 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
17f30 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70  ->intKey ? 0 : p
17f40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
17f50 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
17f60 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
17f70 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
17f80 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
17f90 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
17fa0 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ata ){.    /* Tr
17fb0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
17fc0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
17fd0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
17fe0 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
17ff0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18000 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
18010 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
18020 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
18030 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
18040 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
18050 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
18060 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
18070 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
18080 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
18090 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
180a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
180b0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
180c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
180d0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
180e0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
180f0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
18100 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
18110 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
18120 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
18130 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
18140 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
18150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
18160 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
18170 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
18180 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
18190 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
181a0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
181b0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
181c0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
181d0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
181e0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
181f0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
18200 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
18210 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
18220 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
18230 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
18240 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
18250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18260 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
18270 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
18280 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
18290 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
182a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
182b0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
182c0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
182d0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
182e0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
182f0 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
18300 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
18310 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
18320 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
18330 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
18340 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
18350 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
18360 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
18370 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
18380 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
18390 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
183a0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
183b0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
183c0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
183d0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
183e0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
183f0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
18400 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
18410 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
18420 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
18430 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
18440 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
18450 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
18460 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
18470 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
18480 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
18490 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
184a0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
184b0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
184c0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
184d0 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
184e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
184f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18500 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18510 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18520 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
18530 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18540 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
18550 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
18560 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
18570 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
18580 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
18590 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
185a0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
185b0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
185c0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
185d0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
185e0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
185f0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
18600 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
18610 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
18620 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18630 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
18640 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
18650 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
18660 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18670 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
18680 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
18690 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
186a0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
186b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
186c0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
186d0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
186e0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
186f0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
18700 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
18710 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18720 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18730 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
18740 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
18750 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18760 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
18770 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
18780 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
18790 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
187a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
187b0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
187c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
187d0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
187e0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
187f0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
18800 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18810 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
18820 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
18830 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
18840 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
18850 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
18860 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
18870 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
18880 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
18890 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
188a0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
188b0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
188c0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
188d0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
188e0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
188f0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
18900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18910 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18920 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18930 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
18940 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18950 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
18960 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18970 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18980 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
18990 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
189a0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
189b0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
189c0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
189d0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
189e0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
189f0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
18a00 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
18a10 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18a20 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
18a30 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
18a40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18a50 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
18a60 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
18a70 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
18a80 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
18a90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18aa0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
18ab0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
18ac0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
18ad0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ae0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
18af0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
18b00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
18b10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
18b30 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
18b40 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
18b50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18b60 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
18b70 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
18b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
18b90 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
18ba0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
18bb0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
18bc0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
18bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18be0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18bf0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18c00 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
18c10 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
18c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
18c30 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
18c40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
18c50 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
18c60 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
18c70 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
18c80 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
18c90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18ca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18cb0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
18cc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18cd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18d00 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18d10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18d20 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18d30 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18d40 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18d50 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18d60 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18d70 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18d80 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18da0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18db0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18dc0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18dd0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18de0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18df0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18e00 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18e10 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18e20 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18e30 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18e40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
18e50 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
18e60 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
18e70 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18e80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
18e90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
18ea0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
18eb0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18ec0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18ee0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18ef0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18f00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18f10 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18f20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
18f30 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18f40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18f50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18f70 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
18f80 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
18f90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18fa0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
18fb0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
18fc0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
18fd0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
18fe0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
18ff0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
19000 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
19010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19030 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
19040 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19050 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
19060 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
19070 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
19080 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
19090 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
190a0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
190b0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
190c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
190d0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
190e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
190f0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
19100 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
19110 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
19120 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
19130 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
19140 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
19150 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
19160 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
19170 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19180 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
19190 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
191a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
191b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
191c0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
191d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
191e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
191f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19200 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
19210 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19220 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19230 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
19240 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
19250 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19270 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19280 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19290 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
192a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
192b0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  >pPage!=0 );.   
192c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
192d0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
192e0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
192f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
19300 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
19310 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
19320 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a  t, pBuf, 1, 0);.
19330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
19360 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
19370 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
19380 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
19390 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
193a0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
193b0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
193c0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
193d0 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
193e0 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
193f0 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
19400 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
19410 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
19420 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
19430 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
19440 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
19450 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
19460 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
19470 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
19480 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
19490 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
194a0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
194b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
194c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
194d0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
194e0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
194f0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
19500 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
19510 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
19520 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
19530 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
19540 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
19550 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
19560 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
19570 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
19580 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
19590 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
195a0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
195b0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
195c0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
195d0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
195e0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
195f0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
19600 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
19610 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
19620 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
19630 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
19640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
19650 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
19660 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
19670 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
19680 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
19690 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
196a0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
196b0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
196c0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
196d0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
196e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
196f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
19700 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19710 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
19720 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19730 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
19740 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
19750 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
19760 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
19770 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19780 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19790 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
197a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
197b0 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
197c0 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
197d0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
197e0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
197f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
19800 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
19810 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
19820 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
19830 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
19840 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
19850 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
19860 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19870 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19880 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
19890 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
198a0 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
198b0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
198c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
198d0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
198e0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
198f0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
19900 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
19910 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
19920 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
19930 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
19940 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
19950 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
19960 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
19970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
19980 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
19990 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
199a0 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
199b0 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
199c0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
199d0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
199e0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
199f0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
19a00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
19a10 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
19a20 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
19a30 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
19a40 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
19a50 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
19a60 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
19a70 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
19a80 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
19a90 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
19aa0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
19ab0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
19ac0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
19ad0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
19ae0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
19af0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
19b00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
19b10 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
19b20 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
19b30 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
19b40 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
19b50 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
19b60 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
19b70 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
19b80 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
19b90 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
19ba0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
19bb0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
19bc0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
19bd0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
19be0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
19bf0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
19c00 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
19c10 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
19c20 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
19c30 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
19c40 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
19c50 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
19c60 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
19c70 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
19c80 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
19c90 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
19ca0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
19cb0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19cc0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
19cd0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
19ce0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19cf0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19d00 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19d10 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
19d20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19d30 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
19d40 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
19d50 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
19d60 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
19d70 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e   return 0;.}.con
19d80 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
19d90 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
19da0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19db0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19dc0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19dd0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19de0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19df0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
19e10 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
19e20 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
19e30 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
19e40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
19e50 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
19e60 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
19e70 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
19e80 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
19e90 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
19ea0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
19eb0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
19ec0 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e to..*/.static 
19ed0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
19ee0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19ef0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
19f00 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
19f10 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d  e *pNewPage;.  M
19f20 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65  emPage *pOldPage
19f30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19f40 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
19f50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
19f60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
19f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19f80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
19fa0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
19fb0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
19fc0 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d  &pNewPage, pCur-
19fd0 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  >pPage);.  if( r
19fe0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19ff0 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61   pNewPage->idxPa
1a000 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78  rent = pCur->idx
1a010 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70  ;.  pOldPage = p
1a020 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f  Cur->pPage;.  pO
1a030 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74  ldPage->idxShift
1a040 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1a050 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20  age(pOldPage);. 
1a060 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
1a070 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1a080 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
1a090 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a0a0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a0b0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1a0c0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
1a0d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a0e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1a0f0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1a100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a110 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1a120 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a130 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
1a140 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
1a150 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
1a160 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
1a170 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
1a180 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
1a190 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
1a1a0 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
1a1b0 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
1a1c0 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
1a1d0 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
1a1e0 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
1a1f0 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
1a200 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
1a210 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
1a220 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
1a230 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
1a240 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
1a250 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
1a260 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
1a270 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1a280 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1a290 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1a2a0 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
1a2b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1a2c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1a2d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72  mutex) );.  pPar
1a2e0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
1a2f0 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
1a300 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
1a310 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
1a320 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
1a330 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
1a340 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1a350 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1a360 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
1a370 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1a380 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
1a390 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1a3a0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1a3b0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1a3c0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1a3d0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1a3e0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1a3f0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1a400 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1a410 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1a420 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1a430 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1a440 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1a450 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1a460 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1a470 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1a480 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1a490 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a4a0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1a4b0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1a4c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1a4d0 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67  Parent;.  MemPag
1a4e0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
1a4f0 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73  idxParent;..  as
1a500 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a510 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a520 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a530 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a540 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20  ALID );.  pPage 
1a550 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1a560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
1a570 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
1a580 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1a590 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b  otPage(pPage) );
1a5a0 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
1a5b0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
1a5c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1a5d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a5e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2d 3e 6e  Page->pDbPage->n
1a5f0 52 65 66 3e 30 20 29 3b 0a 20 20 69 64 78 50 61  Ref>0 );.  idxPa
1a600 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64  rent = pPage->id
1a610 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  xParent;.  sqlit
1a620 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
1a630 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1a640 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a650 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
1a660 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70  e = pParent;.  p
1a670 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a680 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a690 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73  idNKey = 0;.  as
1a6a0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
1a6b0 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
1a6c0 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
1a6d0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
1a6e0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a6f0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1a700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a710 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1a720 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1a730 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1a740 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a750 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1a760 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1a770 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a780 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1a790 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1a7a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1a7b0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1a7c0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1a7d0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1a7e0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1a7f0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1a800 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1a810 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a820 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1a830 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a840 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a850 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1a860 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1a870 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a880 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1a890 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1a8a0 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1a8b0 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
1a8c0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1a8d0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
1a8e0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
1a8f0 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
1a900 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1a910 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
1a920 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
1a930 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a940 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1a950 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1a960 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1a970 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1a980 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
1a990 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1a9a0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a9b0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1a9c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a9d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a9e0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
1a9f0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1aa00 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
1aa10 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
1aa20 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1aa30 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
1aa40 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
1aa50 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1aa60 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
1aa70 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
1aa80 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1aa90 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
1aaa0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1aab0 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1aac0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1aad0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1aae0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1aaf0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1ab00 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1ab10 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1ab20 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1ab30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ab40 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1ab50 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
1ab60 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
1ab70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
1ab80 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1ab90 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
1aba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1abb0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1abc0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
1abd0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
1abe0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1abf0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
1ac00 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1ac10 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
1ac20 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
1ac30 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
1ac40 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
1ac50 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
1ac60 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
1ac70 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1ac80 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
1ac90 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1aca0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1acb0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1acc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1acd0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1ace0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1acf0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1ad00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ad10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ad20 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1ad30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad40 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1ad50 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
1ad60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ad70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1ad80 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
1ad90 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1ada0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1adb0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1adc0 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63  r->idx));.    rc
1add0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1ade0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1adf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ae00 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1ae10 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1ae20 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1ae30 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1ae40 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1ae50 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1ae60 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1ae70 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1ae80 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1ae90 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1aea0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1aeb0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1aec0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1aed0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1aee0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1aef0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1af00 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1af10 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1af20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1af30 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1af40 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1af50 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1af60 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1af70 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1af80 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1af90 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1afa0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1afb0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1afc0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1afd0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1afe0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1aff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1b000 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1b010 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b020 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b040 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b050 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1b060 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1b070 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1b080 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1b090 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1b0a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b0b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b0c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b0d0 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1b0e0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1b0f0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b100 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1b110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b120 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
1b130 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  >idx = pPage->nC
1b140 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 75  ell - 1;.    pCu
1b150 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1b160 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1b170 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
1b180 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b190 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
1b1a0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b1b0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1b1c0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1b1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b1e0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1b1f0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1b200 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1b210 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1b220 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1b230 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1b240 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b250 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b260 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1b270 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b280 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b290 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1b2a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b2b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1b2c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b2d0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1b2e0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1b2f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1b300 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1b310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b320 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1b330 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1b340 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1b350 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b360 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1b370 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b380 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b390 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b3b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b3c0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
1b3d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1b3e0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1b3f0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
1b400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b410 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b420 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1b430 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b440 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b450 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b460 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b470 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b480 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b490 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b4a0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b4b0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b4c0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b4d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b4e0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1b4f0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b500 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
1b510 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b520 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b530 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b540 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b550 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1b560 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1b570 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b580 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b5a0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1b5b0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1b5c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b5d0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b5e0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1b5f0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
1b600 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b610 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b620 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b630 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1b640 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1b650 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1b660 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65  ur);.      getCe
1b670 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1b680 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
1b690 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
1b6a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b6b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1b6c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1b6d0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1b6e0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1b6f0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1b700 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
1b710 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
1b720 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
1b730 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
1b740 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
1b750 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
1b760 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1b770 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
1b780 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
1b790 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
1b7a0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
1b7b0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
1b7c0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
1b7d0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
1b7e0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
1b7f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1b800 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
1b810 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
1b820 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
1b830 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
1b840 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
1b850 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
1b860 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
1b870 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
1b880 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
1b890 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
1b8a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  y..**.** The res
1b8b0 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
1b8c0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
1b8d0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
1b8e0 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69   the.** cursor i
1b8f0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52  s written to *pR
1b900 65 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c  es if pRes!=NULL
1b910 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
1b920 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20  f.** this value 
1b930 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
1b940 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
1b950 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1b960 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1b970 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1b980 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1b990 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
1b9a0 72 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69  r than pKey or i
1b9b0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1b9c0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
1b9d0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
1b9e0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
1b9f0 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
1ba00 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
1ba10 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
1ba20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1ba30 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1ba40 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1ba50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ba60 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
1ba70 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  hes pKey..**.** 
1ba80 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
1ba90 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
1baa0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1bab0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
1bae0 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74   pKey..**.*/.int
1baf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1bb00 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
1bb10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1bb20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1bb30 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
1bb40 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1bb50 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
1bb60 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
1bb70 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
1bb80 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
1bb90 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
1bba0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
1bbb0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
1bbc0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1bbd0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1bbe0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1bbf0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc10 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1bc20 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1bc30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1bc40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1bc50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1bc60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bc70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1bc80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1bc90 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
1bca0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
1bcb0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
1bcc0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
1bcd0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
1bce0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
1bcf0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
1bd00 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1bd10 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
1bd20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1bd30 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
1bd40 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26 20  r->validNKey && 
1bd50 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
1bd60 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
1bd70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
1bd80 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1bd90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1bda0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bdb0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
1bdc0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
1bdd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1bde0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
1bdf0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
1be00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1be10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1be20 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1be30 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1be40 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1be50 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1be60 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
1be70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1be80 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ->pPage->isInit 
1be90 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1bea0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1beb0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52  VALID ){.    *pR
1bec0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73  es = -1;.    ass
1bed0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1bee0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
1bef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bf00 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
1bf10 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69  ( pCur->pPage->i
1bf20 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
1bf30 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
1bf40 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1bf50 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1bf60 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1bf70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1bf80 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20  ge;.    int c = 
1bf90 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74  -1;  /* pRes ret
1bfa0 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20  urn if table is 
1bfb0 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31  empty must be -1
1bfc0 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   */.    lwr = 0;
1bfd0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
1bfe0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
1bff0 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  f( !pPage->intKe
1c000 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 20  y && pIdxKey==0 
1c010 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1c020 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c030 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
1c040 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c050 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1c060 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1c070 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20  ur->idx = upr;. 
1c080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c090 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70 72  pCur->idx = (upr
1c0a0 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20  +lwr)/2;.    }. 
1c0b0 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72 20     if( lwr<=upr 
1c0c0 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20  ) for(;;){.     
1c0d0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
1c0e0 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c  .      i64 nCell
1c0f0 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  Key;.      pCur-
1c100 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c110 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1c120 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1c130 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c140 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75  Key ){.        u
1c150 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
1c160 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
1c170 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
1c180 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
1c190 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
1c1a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
1c1b0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
1c1c0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1c1d0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
1c1e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
1c1f0 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
1c200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
1c210 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
1c220 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
1c230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
1c240 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
1c250 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c260 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
1c270 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
1c280 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1c290 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
1c2a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c2b0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
1c2c0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
1c2d0 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
1c2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c2f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1c300 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20  nt available;.  
1c310 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
1c320 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61   (void *)fetchPa
1c330 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61  yload(pCur, &ava
1c340 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  ilable, 0);.    
1c350 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70      nCellKey = p
1c360 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1c370 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69          if( avai
1c380 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20  lable>=nCellKey 
1c390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1c3a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c3b0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b  rdCompare(nCellK
1c3c0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ey, pCellKey, pI
1c3d0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1c3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c3f0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1c400 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
1c410 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1c420 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1c430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c450 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
1c460 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c470 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
1c480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c490 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
1c4a0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
1c4b0 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65   (void *)pCellKe
1c4c0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  y);.          c 
1c4d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1c4e0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
1c4f0 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  Key, pCellKey, p
1c500 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
1c510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c520 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
1c530 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
1c540 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c550 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c560 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
1c570 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
1c580 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c590 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c5a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1c5b0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
1c5c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1c5d0 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1c5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  ;.          upr 
1c5f0 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20  = lwr - 1;.     
1c600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c620 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c630 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1c640 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c650 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c660 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c670 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
1c680 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1c690 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
1c6a0 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
1c6b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c6c0 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
1c6d0 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
1c6e0 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
1c6f0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  pr ){.        pC
1c700 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
1c710 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1c720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c730 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1c740 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a   = (lwr+upr)/2;.
1c750 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c760 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
1c770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c780 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
1c790 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1c7a0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1c7b0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1c7c0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
1c7d0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
1c7e0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
1c7f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c800 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c810 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
1c820 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c830 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1c840 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
1c850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
1c860 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
1c870 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1c880 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1c890 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
1c8a0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1c8b0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1c8c0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1c8d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1c8e0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1c8f0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1c900 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20  ur->idx = lwr;. 
1c910 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1c920 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1c930 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1c940 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1c950 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
1c960 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
1c970 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1c980 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
1c990 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
1c9a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c9b0 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
1c9c0 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
1c9d0 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
1c9e0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
1c9f0 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
1ca00 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
1ca10 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1ca20 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
1ca30 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
1ca40 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
1ca50 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
1ca60 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
1ca70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ca80 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
1ca90 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
1caa0 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
1cab0 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
1cac0 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
1cad0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1cae0 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
1caf0 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
1cb00 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
1cb10 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1cb20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
1cb30 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
1cb40 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
1cb50 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
1cb60 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
1cb70 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
1cb80 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1cb90 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1cba0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1cbb0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
1cbc0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1cbd0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1cbe0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
1cbf0 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
1cc00 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
1cc10 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
1cc20 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1cc30 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1cc40 20 61 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20   aSpace[16]; /* 
1cc50 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
1cc60 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
1cc70 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
1cc80 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1cc90 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1cca0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1ccb0 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
1ccc0 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  o, nKey, pKey,. 
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccf0 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
1cd00 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
1cd10 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
1cd20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1cd30 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1cd40 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
1cd50 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1cd60 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
1cd70 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
1cd80 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
1cd90 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
1cda0 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
1cdb0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
1cdc0 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
1cdd0 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1cde0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1cdf0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1ce00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1ce10 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1ce20 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1ce30 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1ce40 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1ce50 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1ce60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1ce70 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1ce80 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1ce90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1cea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1ceb0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1cec0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1ced0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1cee0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1cef0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1cf00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1cf10 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1cf20 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1cf30 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1cf40 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1cf50 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1cf60 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1cf70 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1cf80 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1cf90 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1cfa0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1cfb0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1cfc0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1cfd0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1cfe0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1cff0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1d000 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1d010 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1d020 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1d030 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d040 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1d050 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1d060 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1d070 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1d080 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1d090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d0a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1d0b0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1d0c0 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1d0d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1d0e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1d0f0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1d100 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1d110 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d120 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d130 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d140 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d150 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d160 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d170 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1d180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1d190 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1d1a0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1d1b0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1d1c0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1d1d0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1d1e0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d1f0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d200 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1d210 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1d220 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d230 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1d240 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1d250 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1d260 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1d280 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d290 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
1d2a0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1d2b0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
1d2c0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
1d2d0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
1d2e0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
1d2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1d300 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
1d310 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
1d320 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
1d330 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
1d340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d350 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
1d360 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1d370 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
1d380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d390 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
1d3a0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1d3b0 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
1d3c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d3d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d3e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
1d3f0 3e 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  >idx>=pPage->nCe
1d400 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
1d410 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d420 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1d430 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
1d440 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d450 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d460 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
1d470 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1d480 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
1d490 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d4a0 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
1d4b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1d4c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1d4d0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  do{.      if( sq
1d4e0 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1d4f0 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20  Page(pPage) ){. 
1d500 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1d510 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
1d520 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1d530 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
1d540 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d550 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1d560 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1d570 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
1d580 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
1d590 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1d5a0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64  }while( pCur->id
1d5b0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
1d5c0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
1d5d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
1d5e0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1d5f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1d600 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
1d610 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1d620 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d630 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
1d640 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d650 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
1d660 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1d670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d680 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
1d690 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1d6a0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d6b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
1d6c0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
1d6d0 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
1d6e0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
1d6f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1d700 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1d710 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1d720 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1d730 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1d740 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1d750 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1d760 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
1d770 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
1d780 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
1d790 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
1d7a0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
1d7b0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
1d7c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d7d0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1d7e0 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
1d7f0 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  o;.  MemPage *pP
1d800 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1d810 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1d820 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1d830 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1d840 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1d850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d860 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d870 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1d880 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1d890 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1d8a0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d8b0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d8c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d8d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d8e0 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1d8f0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d900 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d910 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d920 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d930 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d940 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d950 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
1d960 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1d970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d980 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
1d990 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d9a0 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
1d9b0 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c  t4byte( findCell
1d9c0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1d9d0 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  x) );.    rc = m
1d9e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d9f0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1da00 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1da10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1da20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1da30 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1da40 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1da50 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1da60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1da70 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1da80 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1da90 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1daa0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1dab0 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1dac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1dad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1daf0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1db00 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1db10 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1db20 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1db30 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1db40 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1db50 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1db60 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1db70 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1db80 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
1db90 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1dba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1dbb0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
1dbc0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
1dbd0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1dbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1dbf0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1dc00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dc10 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1dc20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
1dc30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
1dc50 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
1dc60 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
1dc70 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
1dc80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
1dc90 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
1dca0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
1dcb0 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
1dcc0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
1dcd0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
1dce0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
1dcf0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
1dd00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1dd10 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
1dd20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1dd30 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1dd40 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
1dd50 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
1dd60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
1dd70 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
1dd80 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
1dd90 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
1dda0 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
1ddb0 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
1ddc0 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
1ddd0 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
1dde0 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
1ddf0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
1de00 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
1de10 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
1de20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1de30 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
1de40 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
1de50 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
1de60 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
1de70 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
1de80 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
1de90 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
1dea0 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
1deb0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1dec0 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
1ded0 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
1dee0 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
1def0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
1df00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1df10 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
1df20 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
1df30 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
1df40 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1df50 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
1df60 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
1df70 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
1df80 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
1df90 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
1dfa0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
1dfb0 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
1dfc0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
1dfd0 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
1dfe0 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
1dff0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e000 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
1e010 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
1e020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e030 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
1e040 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1e050 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
1e060 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
1e070 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
1e080 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
1e090 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1e0a0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
1e0b0 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f 2a  .  int n;     /*
1e0c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e0d0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e0e0 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20 20   */.  int k;    
1e0f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1e100 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
1e110 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
1e120 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
1e130 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
1e140 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
1e150 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  k = 0;..  assert
1e160 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e170 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1e180 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
1e190 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e 20  Bt->pPage1;.  n 
1e1a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e1b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e1c0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1e1d0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
1e1e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1e1f0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
1e200 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
1e210 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
1e220 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
1e230 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
1e240 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
1e250 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
1e260 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
1e270 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
1e280 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
1e290 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
1e2a0 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
1e2b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
1e2c0 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
1e2d0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1e2e0 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
1e2f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1e300 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
1e310 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
1e320 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
1e330 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
1e340 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e350 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1e360 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
1e370 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65 72  && nearby<=pager
1e380 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1e390 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1e3a0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1e3b0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1e3c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1e3d0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1e3e0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1e3f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1e400 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1e410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1e420 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e430 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1e440 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1e450 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1e460 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1e470 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1e480 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1e490 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1e4a0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1e4b0 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1e4c0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1e4d0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1e4e0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1e4f0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1e500 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1e510 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1e520 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1e530 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e540 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e550 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1e570 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1e580 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1e590 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1e5a0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1e5b0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1e5c0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1e5d0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1e5e0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1e5f0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1e600 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1e610 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1e620 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1e630 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1e640 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1e650 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1e660 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1e670 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1e680 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1e690 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1e6a0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1e6b0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1e6c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1e6d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e6e0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1e6f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1e700 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1e710 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1e720 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1e730 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
1e740 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1e750 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1e760 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1e770 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1e780 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1e790 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1e7a0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1e7b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1e7c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
1e7d0 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
1e7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1e7f0 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
1e800 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
1e810 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
1e820 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
1e830 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
1e840 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
1e850 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
1e860 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
1e870 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
1e880 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
1e890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1e8a0 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
1e8b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e8c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1e8d0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1e8e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1e8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1e900 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1e910 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1e920 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1e930 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
1e940 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1e950 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1e960 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1e970 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1e980 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1e990 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1e9a0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1e9b0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1e9c0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1e9d0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1e9e0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1e9f0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
1ea00 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1ea10 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
1ea20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
1ea30 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
1ea40 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1ea50 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1ea60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea70 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1ea80 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ea90 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
1eaa0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1eab0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
1eac0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
1ead0 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
1eae0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
1eaf0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
1eb00 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
1eb10 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
1eb20 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
1eb30 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
1eb40 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1eb50 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
1eb60 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
1eb70 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1eb80 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
1eb90 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
1eba0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1ebb0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1ebc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
1ebd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ebe0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1ebf0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ec00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1ec10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ec20 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1ec30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1ec40 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
1ec50 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1ec60 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1ec70 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1ec80 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1ec90 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1eca0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1ecb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ecc0 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
1ecd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1ece0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1ecf0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1ed00 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1ed10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1ed20 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
1ed30 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1ed40 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
1ed50 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
1ed60 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
1ed70 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
1ed80 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
1ed90 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
1eda0 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
1edb0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1edc0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1edd0 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
1ede0 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
1edf0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
1ee00 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
1ee10 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1ee20 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
1ee30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ee40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
1ee50 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1ee60 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
1ee70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ee80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ee90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1eea0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1eeb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1eed0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
1eee0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1eef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ef00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ef10 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1ef20 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1ef30 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1ef40 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ef50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1ef60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1ef70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1ef80 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1ef90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1efa0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1efb0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1efc0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1efd0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1efe0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1eff0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1f000 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1f010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
1f020 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1f030 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1f040 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1f050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1f060 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1f070 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
1f080 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1f090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f0a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f0b0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
1f0c0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1f0d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1f0e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1f0f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f100 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f120 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f130 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1f140 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
1f150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f170 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1f180 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1f190 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1f1a0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1f1b0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1f1c0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
1f1d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f1e0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
1f1f0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
1f200 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
1f210 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
1f220 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
1f230 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1f240 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
1f250 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
1f260 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f270 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1f280 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1f290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1f2a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1f2b0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1f2c0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1f2d0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1f2e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1f2f0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1f300 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f310 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1f320 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1f330 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1f340 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1f350 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1f360 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1f370 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1f380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1f390 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1f3a0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1f3b0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1f3c0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1f3d0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1f3e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1f3f0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1f400 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1f410 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1f420 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1f430 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f460 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1f470 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f480 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1f490 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1f4a0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1f4b0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1f4c0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1f4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1f4e0 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   nPage;.        
1f4f0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
1f500 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 61 67  ;.          nPag
1f510 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
1f520 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
1f530 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
1f540 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b 0a 20  pPgno>nPage ){. 
1f550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
1f560 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
1f570 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
1f580 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
1f590 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f5a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1f5b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1f5c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1f5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f5e0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1f5f0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
1f600 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
1f610 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
1f620 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
1f630 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
1f640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f650 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
1f660 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
1f670 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
1f680 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
1f690 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
1f6a0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
1f6b0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
1f6c0 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
1f6d0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1f6e0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
1f6f0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
1f700 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1f710 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f720 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
1f730 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29  Pgno, ppPage, 1)
1f740 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f760 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f770 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1f780 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65 29 2d  lback((*ppPage)-
1f790 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f7a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f7b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
1f7c0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1f7d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f7e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f800 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
1f810 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1f820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f830 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
1f840 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
1f850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f860 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f870 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
1f880 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1f890 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
1f8a0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
1f8b0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1f8c0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
1f8d0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
1f8e0 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   so create a new
1f8f0 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20   page at the.   
1f900 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66   ** end of the f
1f910 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ile */.    int n
1f920 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
1f930 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1f940 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  r);.    *pPgno =
1f950 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23 69 66   nPage + 1;..#if
1f960 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f970 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f980 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1f990 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 69  ){.      /* An i
1f9a0 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73 20 61  ncr-vacuum has a
1f9b0 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74 68 69  lready run withi
1f9c0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
1f9d0 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20 20 20  on. So the.     
1f9e0 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c 6c 6f   ** page to allo
1f9f0 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72 6f 6d  cate is not from
1fa00 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 65 6e   the physical en
1fa10 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 62  d of the file, b
1fa20 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 70  ut.      ** at p
1fa30 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20 20 20  Bt->nTrunc. .   
1fa40 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 50 67     */.      *pPg
1fa50 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  no = pBt->nTrunc
1fa60 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  +1;.      if( *p
1fa70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
1fa80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1fa90 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29          (*pPgno)
1faa0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fab0 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  }.    if( pBt->a
1fac0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
1fad0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1fae0 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  *pPgno) ){.     
1faf0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
1fb00 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
1fb10 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
1fb20 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
1fb30 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
1fb40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
1fb50 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
1fb60 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
1fb70 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
1fb80 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
1fb90 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
1fba0 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
1fbb0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
1fbc0 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
1fbd0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1fbe0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1fbf0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
1fc00 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
1fc10 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20  ", *pPgno));.   
1fc20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1fc30 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1fc40 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
1fc50 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1fc60 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
1fc70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fc80 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70 50 67  GE(pBt) ){ (*pPg
1fc90 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 20  no)++; }.    }. 
1fca0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
1fcb0 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  nc ){.      pBt-
1fcc0 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f  >nTrunc = *pPgno
1fcd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1fce0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
1fcf0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
1fd00 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
1fd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1fd20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1fd30 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1fd40 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1fd50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fd60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fd70 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
1fd80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1fd90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fda0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1fdb0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
1fdc0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
1fdd0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1fde0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
1fdf0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1fe00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1fe10 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1fe20 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1fe30 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
1fe40 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
1fe50 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
1fe60 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
1fe70 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
1fe80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
1fe90 61 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  a page of the da
1fea0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74  tabase file to t
1feb0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a  he freelist..**.
1fec0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1fed0 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20 63 61  nref() is NOT ca
1fee0 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65 2e 0a  lled for pPage..
1fef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
1ff00 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
1ff10 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  pPage){.  BtShar
1ff20 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1ff30 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1ff40 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1ff50 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c  Page1;.  int rc,
1ff60 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65   n, k;..  /* Pre
1ff70 70 61 72 65 20 74 68 65 20 70 61 67 65 20 66 6f  pare the page fo
1ff80 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61  r freeing */.  a
1ff90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ffa0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1ffb0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1ffc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1ffd0 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 50 61  >pgno>1 );.  pPa
1ffe0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
1fff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
20000 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  age->pParent);. 
20010 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
20020 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  = 0;..  /* Incre
20030 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
20040 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
20050 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
20060 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20070 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20080 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
20090 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74  rn rc;.  n = get
200a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
200b0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
200c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
200d0 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a  Data[36], n+1);.
200e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
200f0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
20100 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
20110 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
20120 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
20130 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
20140 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
20150 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
20160 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
20170 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
20180 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
20190 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
201a0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
201b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
201c0 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61  rc;.  memset(pPa
201d0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
201e0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
201f0 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
20200 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
20210 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
20220 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
20230 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
20240 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
20250 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
20260 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
20270 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
20280 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
20290 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
202a0 70 42 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  pBt, pPage->pgno
202b0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
202c0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
202d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
202e0 20 7d 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29   }..  if( n==0 )
202f0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
20300 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
20310 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  page */.    rc =
20320 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20330 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
20340 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
20350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20360 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
20370 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ata, 0, 8);.    
20380 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20390 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
203a0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54  ge->pgno);.    T
203b0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
203c0 3a 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70  : %d first\n", p
203d0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
203e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74  }else{.    /* Ot
203f0 68 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61  her free pages a
20400 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52  lready exist.  R
20410 65 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74  etrive the first
20420 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
20430 2a 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ** of the freeli
20440 73 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20  st and find out 
20450 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20  how many leaves 
20460 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d  it has. */.    M
20470 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a  emPage *pTrunk;.
20480 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20490 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
204a0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
204b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20  e1->aData[32]), 
204c0 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
204d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
204e0 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74   rc;.    k = get
204f0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
20500 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66  Data[4]);.    if
20510 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ( k>=pBt->usable
20520 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
20530 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
20540 20 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20   is full.  Turn 
20550 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
20560 72 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a  reed into a new.
20570 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70        ** trunk p
20580 61 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76  age with no leav
20590 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
205a0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
205b0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
205c0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
205d0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
205e0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
205f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
20600 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
20610 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
20620 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
20630 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
20640 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
20650 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
20660 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
20670 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
20680 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
20690 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
206a0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
206b0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
206c0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
206d0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
206e0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
206f0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
20700 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
20710 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
20720 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
20730 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
20740 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
20750 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
20760 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
20770 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
20780 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
20790 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
207a0 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
207b0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
207c0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
207d0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
207e0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
207f0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
20800 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
20810 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
20820 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
20830 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
20840 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
20850 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
20860 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
20870 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
20880 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20890 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
208a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
208b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
208c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
208d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
208e0 65 2d 3e 61 44 61 74 61 2c 20 70 54 72 75 6e 6b  e->aData, pTrunk
208f0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
20900 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
20910 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
20920 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
20930 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20940 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20950 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
20960 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
20970 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
20980 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
20990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
209a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54   pPage->pgno, pT
209b0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
209c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
209d0 69 66 28 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20  if( k<0 ){.     
209e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
209f0 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
20a00 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68  .      /* Add th
20a10 65 20 6e 65 77 6c 79 20 66 72 65 65 64 20 70 61  e newly freed pa
20a20 67 65 20 61 73 20 61 20 6c 65 61 66 20 6f 6e 20  ge as a leaf on 
20a30 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 75 6e  the current trun
20a40 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  k */.      rc = 
20a50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20a60 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
20a70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
20a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20a90 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
20aa0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
20ab0 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20  ], k+1);.       
20ac0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
20ad0 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c  k->aData[8+k*4],
20ae0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23   pPage->pgno);.#
20af0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45  ifndef SQLITE_SE
20b00 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
20b10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20b20 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
20b30 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e 64 69  >pDbPage);.#endi
20b40 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
20b50 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
20b60 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
20b70 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
20b80 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
20b90 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  k->pgno));.    }
20ba0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
20bb0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20  (pTrunk);.  }.  
20bc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20bd0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
20be0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
20bf0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
20c00 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
20c10 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
20c20 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
20c30 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
20c40 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
20c50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
20c60 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
20c70 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
20c80 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
20c90 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
20ca0 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61 67 65  ;.  int ovflPage
20cb0 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
20cc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20cd0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
20ce0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
20cf0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
20d00 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
20d10 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
20d20 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
20d30 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
20d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
20d50 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
20d60 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
20d70 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
20d80 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
20d90 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
20da0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
20db0 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50 61 67  low]);.  ovflPag
20dc0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
20dd0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
20de0 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
20df0 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
20e00 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
20e10 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
20e20 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
20e30 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
20e40 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
20e50 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
20e60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
20e70 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
20e80 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50 67 6e  no==0 || ovflPgn
20e90 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
20ea0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
20eb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20ec0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20ed0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  T;.    }..    rc
20ee0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
20ef0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
20f00 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c  , &pOvfl, (nOvfl
20f10 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f  ==0)?0:&ovflPgno
20f20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20f30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
20f40 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76  c = freePage(pOv
20f50 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fl);.    sqlite3
20f60 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
20f70 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20f80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20f90 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
20fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20fb0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
20fc0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
20fd0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
20fe0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
20ff0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
21000 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
21010 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
21020 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
21030 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
21040 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
21050 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
21060 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
21070 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
21080 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
21090 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
210a0 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
210b0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
210c0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
210d0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
210e0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
210f0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
21100 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
21110 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
21120 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
21130 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
21140 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
21150 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
21160 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
21170 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
21180 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
21190 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
211a0 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
211b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
211c0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
211d0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
211e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
211f0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
21200 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
21210 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21220 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
21230 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
21240 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
21250 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21260 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
21270 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
21280 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
21290 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
212a0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
212b0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212d0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
212e0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
212f0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
21300 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
21310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
21320 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
21330 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
21340 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
21350 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
21360 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
21370 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
21380 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
21390 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
213a0 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
213b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
213c0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
213d0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
213e0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
213f0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
21400 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
21410 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
21420 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
21430 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
21440 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21450 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
21460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
21470 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
21480 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
21490 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
214a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
214b0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
214c0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
214d0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
214e0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
214f0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
21500 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
21510 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
21520 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
21530 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
21540 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
21550 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
21560 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
21570 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
21580 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
21590 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
215a0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
215b0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
215c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
215d0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
215e0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
215f0 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72  Data==nData+nZer
21600 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  o );.  .  /* Fil
21610 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
21620 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
21630 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
21640 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
21650 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
21660 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
21670 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
21680 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
21690 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  e{.    nPayload 
216a0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  += nKey;.    pSr
216b0 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
216c0 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  rc = nKey;.  }. 
216d0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
216e0 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
216f0 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
21700 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
21710 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
21720 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
21730 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
21740 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
21750 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
21760 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
21770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45  ){.      int isE
21780 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65  xact = 0;.#ifnde
21790 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
217a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
217b0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
217c0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
217d0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
217e0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
217f0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
21800 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
21810 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
21820 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
21830 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
21840 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
21850 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
21860 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
21870 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
21880 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21890 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
218a0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76        if( pgnoOv
218b0 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  fl>1 ){.        
218c0 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31    /* isExact = 1
218d0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  ; */.        }. 
218e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
218f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
21900 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
21910 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
21920 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45  l, pgnoOvfl, isE
21930 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  xact);.#ifndef S
21940 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21950 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
21960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
21970 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
21980 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
21990 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
219a0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
219b0 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
219c0 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
219d0 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
219e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
219f0 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
21a00 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
21a10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
21a20 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
21a30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
21a40 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
21a50 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
21a60 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
21a70 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
21a80 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
21a90 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
21aa0 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
21ab0 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
21ac0 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
21ad0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
21ae0 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
21af0 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
21b00 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
21b10 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20  tialised values 
21b20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
21b30 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
21b40 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
21b50 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
21b60 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
21b70 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
21b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21b90 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
21ba0 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
21bb0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
21bc0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
21bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
21be0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
21bf0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
21c00 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20  noPtrmap);.     
21c10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21c20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
21c30 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
21c40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
21c50 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
21c60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
21c70 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
21c80 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
21c90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
21ca0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
21cb0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
21cc0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
21cd0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
21ce0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
21cf0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
21d00 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
21d10 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
21d20 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
21d30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
21d40 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
21d50 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
21d60 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
21d70 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
21d80 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
21d90 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
21da0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
21db0 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66  paceLeft;.    if
21dc0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
21dd0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
21de0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
21df0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
21e00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
21e10 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
21e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e30 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
21e40 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
21e50 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
21e60 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
21e70 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
21e80 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
21e90 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
21ea0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
21eb0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
21ec0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
21ed0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
21ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21ef0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
21f00 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
21f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
21f20 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21f30 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
21f40 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70  pointer on the p
21f50 61 67 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72  age whose number
21f60 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20   is.** given in 
21f70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
21f80 65 6e 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50  ent so that MemP
21f90 61 67 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64  age.pParent hold
21fa0 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72  s the.** pointer
21fb0 20 69 6e 20 74 68 65 20 74 68 69 72 64 20 61 72   in the third ar
21fc0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
21fd0 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75 6d   the final argum
21fe0 65 6e 74 2c 20 75 70 64 61 74 65 50 74 72 6d 61  ent, updatePtrma
21ff0 70 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  p, is non-zero a
22000 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  nd the database.
22010 2a 2a 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  ** is an auto-va
22020 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
22030 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
22040 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 67  map entry for pg
22050 6e 6f 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  no.** is updated
22060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22070 72 65 70 61 72 65 6e 74 50 61 67 65 28 0a 20 20  reparentPage(.  
22080 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220a0 20 42 2d 54 72 65 65 20 73 74 72 75 63 74 75 72   B-Tree structur
220b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
220c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
220d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
220e0 62 65 72 20 6f 66 20 63 68 69 6c 64 20 62 65 69  ber of child bei
220f0 6e 67 20 61 64 6f 70 74 65 64 20 2a 2f 0a 20 20  ng adopted */.  
22100 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72  MemPage *pNewPar
22110 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ent,          /*
22120 20 4e 65 77 20 70 61 72 65 6e 74 20 6f 66 20 70   New parent of p
22130 67 6e 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  gno */.  int idx
22140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22150 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22160 6f 66 20 63 68 69 6c 64 20 70 61 67 65 20 70 67  of child page pg
22170 6e 6f 20 69 6e 20 70 4e 65 77 50 61 72 65 6e 74  no in pNewParent
22180 20 2a 2f 0a 20 20 69 6e 74 20 75 70 64 61 74 65   */.  int update
22190 50 74 72 6d 61 70 20 20 20 20 20 20 20 20 20 20  Ptrmap          
221a0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
221b0 75 70 64 61 74 65 20 70 6f 69 6e 74 65 72 2d 6d  update pointer-m
221c0 61 70 20 66 6f 72 20 70 67 6e 6f 20 2a 2f 0a 29  ap for pgno */.)
221d0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68  {.  MemPage *pTh
221e0 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  is;.  DbPage *pD
221f0 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
22200 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22210 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
22220 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
22230 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20  ewParent!=0 );. 
22240 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
22250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22260 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
22270 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 70  pPager!=0 );.  p
22280 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
22290 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
222a0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
222b0 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
222c0 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d 65  .    pThis = (Me
222d0 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
222e0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
222f0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Page);.    if( p
22300 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  This->isInit ){.
22310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
22320 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69  his->aData==sqli
22330 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
22340 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
22350 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61    if( pThis->pPa
22360 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e 74  rent!=pNewParent
22370 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
22380 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 29  pThis->pParent )
22390 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
223a0 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  ef(pThis->pParen
223b0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
223c0 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61 72       pThis->pPar
223d0 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e 74  ent = pNewParent
223e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
223f0 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50 61  3PagerRef(pNewPa
22400 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
22410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
22420 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  his->idxParent =
22430 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   idx;.    }.    
22440 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
22450 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  f(pDbPage);.  }.
22460 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
22470 55 55 4d 20 26 26 20 75 70 64 61 74 65 50 74 72  UUM && updatePtr
22480 6d 61 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  map ){.    retur
22490 6e 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  n ptrmapPut(pBt,
224a0 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
224b0 52 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d  REE, pNewParent-
224c0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 23 69 66  >pgno);.  }..#if
224d0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
224e0 20 49 66 20 74 68 65 20 75 70 64 61 74 65 50 74   If the updatePt
224f0 72 6d 61 70 20 66 6c 61 67 20 77 61 73 20 63 6c  rmap flag was cl
22500 65 61 72 2c 20 61 73 73 65 72 74 20 74 68 61 74  ear, assert that
22510 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68   the entry in th
22520 65 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  e.  ** pointer-m
22530 61 70 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  ap is already co
22540 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  rrect..  */.  if
22550 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
22560 7b 0a 20 20 20 20 70 44 62 50 61 67 65 20 3d 20  {.    pDbPage = 
22570 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
22580 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 50  up(pBt->pPager,P
22590 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
225a0 2c 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28  ,pgno));.    if(
225b0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
225c0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
225d0 20 20 50 67 6e 6f 20 69 69 3b 0a 20 20 20 20 20    Pgno ii;.     
225e0 20 69 6e 74 20 72 63 20 3d 20 70 74 72 6d 61 70   int rc = ptrmap
225f0 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  Get(pBt, pgno, &
22600 65 54 79 70 65 2c 20 26 69 69 29 3b 0a 20 20 20  eType, &ii);.   
22610 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
22620 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3d 3d  QLITE_OK && ii==
22630 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
22640 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
22650 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20  P_BTREE );.     
22660 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
22670 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
22680 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
22690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
226a0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  K;.}..../*.** Ch
226b0 61 6e 67 65 20 74 68 65 20 70 50 61 72 65 6e 74  ange the pParent
226c0 20 70 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20   pointer of all 
226d0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67  children of pPag
226e0 65 20 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a  e to point back.
226f0 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a  ** to pPage..**.
22700 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
22710 73 2c 20 66 6f 72 20 65 76 65 72 79 20 63 68 69  s, for every chi
22720 6c 64 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76  ld of pPage, inv
22730 6f 6b 65 20 72 65 70 61 72 65 6e 74 50 61 67 65  oke reparentPage
22740 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75  ().** to make su
22750 72 65 20 74 68 61 74 20 65 61 63 68 20 63 68 69  re that each chi
22760 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50  ld knows that pP
22770 61 67 65 20 69 73 20 69 74 73 20 70 61 72 65 6e  age is its paren
22780 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
22790 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
227a0 64 20 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63  d after you memc
227b0 70 79 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e  py() one page in
227c0 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a  to.** another..*
227d0 2a 0a 2a 2a 20 49 66 20 75 70 64 61 74 65 50 74  *.** If updatePt
227e0 72 6d 61 70 20 69 73 20 74 72 75 65 2c 20 74 68  rmap is true, th
227f0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
22800 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
22810 6c 6c 20 63 68 69 6c 64 0a 2a 2a 20 70 61 67 65  ll child.** page
22820 73 20 6f 66 20 70 50 61 67 65 20 61 72 65 20 75  s of pPage are u
22830 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  pdated..*/.stati
22840 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68  c int reparentCh
22850 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65  ildPages(MemPage
22860 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 75 70 64   *pPage, int upd
22870 61 74 65 50 74 72 6d 61 70 29 7b 0a 20 20 69 6e  atePtrmap){.  in
22880 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22890 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
228a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
228b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
228c0 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  ) );.  if( !pPag
228d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
228e0 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
228f0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
22900 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 69  >pBt;.    Pgno i
22910 52 69 67 68 74 20 3d 20 67 65 74 34 62 79 74 65  Right = get4byte
22920 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
22930 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
22940 38 5d 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  8]);..    for(i=
22950 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
22960 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
22970 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
22980 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
22990 20 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65       rc = repare
229a0 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
229b0 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
229c0 67 65 2c 20 69 2c 20 75 70 64 61 74 65 50 74 72  ge, i, updatePtr
229d0 6d 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  map);.      if( 
229e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
229f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
22a00 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
22a10 6e 74 50 61 67 65 28 70 42 74 2c 20 69 52 69 67  ntPage(pBt, iRig
22a20 68 74 2c 20 70 50 61 67 65 2c 20 69 2c 20 75 70  ht, pPage, i, up
22a30 64 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20 20  datePtrmap);.   
22a40 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
22a50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
22a60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22a70 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
22a80 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
22a90 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
22aa0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
22ab0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
22ac0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
22ad0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
22ae0 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
22af0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
22b00 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
22b10 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
22b20 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
22b30 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
22b40 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
22b50 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
22b60 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
22b70 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
22b80 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
22b90 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
22ba0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
22bb0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
22bc0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
22bd0 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
22be0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22bf0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
22c00 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
22c10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
22c20 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
22c30 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
22c40 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
22c50 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
22c60 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
22c70 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
22c80 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
22c90 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
22ca0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
22cb0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
22cc0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
22cd0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
22ce0 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
22cf0 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
22d00 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
22d10 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
22d20 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
22d30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22d40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
22d50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
22d60 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
22d70 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
22d80 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
22d90 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
22da0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
22db0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61 73 73  byte(ptr);.  ass
22dc0 65 72 74 28 20 70 63 3e 31 30 20 26 26 20 70 63  ert( pc>10 && pc
22dd0 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz<=pPage->pBt-
22de0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
22df0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
22e00 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72  , pc, sz);.  for
22e10 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
22e20 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
22e30 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
22e40 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
22e50 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
22e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
22e70 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
22e80 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
22e90 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
22ea0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
22eb0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
22ec0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
22ed0 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  ift = 1;.}../*.*
22ee0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
22ef0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
22f00 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
22f10 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
22f20 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
22f30 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
22f40 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
22f50 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
22f60 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
22f70 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
22f80 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
22f90 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
22fa0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
22fb0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
22fc0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
22fd0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
22fe0 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
22ff0 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
23000 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
23010 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
23020 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
23030 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
23040 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
23050 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
23060 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
23070 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
23080 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
23090 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
230a0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
230b0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
230c0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
230d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
230e0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
230f0 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
23100 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
23110 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
23120 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
23130 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
23140 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
23150 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
23160 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
23170 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
23180 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
23190 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
231a0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
231b0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
231c0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
231d0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
231e0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
231f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23200 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
23210 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
23220 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
23230 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
23240 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
23250 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
23260 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
23270 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
23280 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
23290 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
232a0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
232b0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
232c0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
232d0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
232e0 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
232f0 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
23300 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
23310 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
23320 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
23330 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20  /.  u8 nSkip    
23340 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
23350 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  write the first 
23360 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
23370 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20  he cell */.){.  
23380 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20  int idx;        
23390 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
233a0 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
233b0 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
233c0 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
233d0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
233e0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
233f0 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  op;          /* 
23400 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f  First byte of co
23410 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65  ntent for any ce
23420 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ll in data[] */.
23430 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20    int end;      
23440 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
23450 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  e past the last 
23460 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
23470 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
23480 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ins;          /*
23490 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d   Index in data[]
234a0 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20   where new cell 
234b0 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72  pointer is inser
234c0 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ted */.  int hdr
234d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
234e0 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d  fset into data[]
234f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61   of the page hea
23500 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
23510 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64  lOffset;   /* Ad
23520 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63  dress of first c
23530 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
23540 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64  ata[] */.  u8 *d
23550 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
23560 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
23570 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
23580 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
23590 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72       /* Used for
235a0 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74   moving informat
235b0 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61  ion around in da
235c0 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ta[] */..  asser
235d0 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
235e0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
235f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
23600 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
23610 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
23620 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
23630 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
23640 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
23650 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
23660 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
23670 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
23680 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
23690 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
236a0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
236b0 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
236c0 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
236d0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
236e0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  mp;.    }.    j 
236f0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
23700 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
23710 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65  ( j<sizeof(pPage
23720 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
23730 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
23740 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
23750 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
23760 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
23770 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
23780 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   i;.    pPage->n
23790 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
237a0 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
237b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
237c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
237d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
237e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
237f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23800 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
23810 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
23820 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
23830 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
23840 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
23850 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
23860 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
23870 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
23880 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
23890 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
238a0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
238b0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
238c0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
238d0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
238e0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
238f0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
23900 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
23910 73 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66 72  sz ){.      defr
23920 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
23930 29 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67  );.      top = g
23940 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
23950 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
23960 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
23970 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
23980 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
23990 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
239a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
239b0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
239c0 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
239d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
239e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
239f0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
23a00 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20  e->nFree -= 2;. 
23a10 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
23a20 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
23a30 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
23a40 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e  p);.    for(j=en
23a50 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  d-2, ptr=&data[j
23a60 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
23a70 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
23a80 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
23a90 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
23aa0 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
23ab0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
23ac0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
23ad0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23ae0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
23af0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
23b00 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
23b10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23b20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
23b30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
23b40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23b50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
23b60 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
23b70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
23b80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
23b90 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
23ba0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
23bb0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
23bc0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
23bd0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
23be0 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
23bf0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
23c00 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
23c10 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
23c20 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
23c30 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
23c40 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
23c50 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
23c60 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
23c70 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
23c80 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
23c90 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
23ca0 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
23cb0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
23cc0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
23cd0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
23ce0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
23cf0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
23d00 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
23d10 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
23d20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
23d30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
23d40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23d50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
23d60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
23d70 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23d80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23d90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
23da0 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
23db0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
23dc0 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
23dd0 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
23de0 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
23df0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
23e00 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
23e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23e20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
23e30 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
23e40 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
23e50 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
23e60 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
23e70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
23e80 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
23e90 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
23ea0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
23eb0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
23ec0 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
23ed0 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
23ee0 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
23ef0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
23f00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
23f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23f20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
23f30 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
23f40 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
23f50 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
23f60 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
23f70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
23f80 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
23f90 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
23fa0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
23fb0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
23fc0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
23fd0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
23fe0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
23ff0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
24000 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
24010 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
24020 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
24030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24040 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
24050 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
24060 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
24070 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74  >mutex) );.  tot
24080 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
24090 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
240a0 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
240b0 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
240c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
240d0 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
240e0 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
240f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24100 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
24110 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
24120 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
24130 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
24140 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
24150 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
24160 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
24170 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
24180 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
24190 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
241a0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
241b0 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
241c0 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
241d0 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
241e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
241f0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
24200 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
24210 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
24220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
24230 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
24240 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
24250 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
24260 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24270 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
24280 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
24290 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
242a0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
242b0 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
242c0 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
242d0 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
242e0 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
242f0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
24300 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
24310 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
24320 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24330 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
24340 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
24350 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
24360 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
24370 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
24380 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
24390 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
243a0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
243b0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
243c0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
243d0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
243e0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
243f0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
24400 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
24410 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
24420 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
24430 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
24440 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
24450 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
24460 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
24470 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
24480 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
24490 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
244a0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
244b0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
244c0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
244d0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
244e0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
244f0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
24500 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
24510 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
24520 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
24530 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
24540 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
24550 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
24560 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
24570 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
24580 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
24590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
245a0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
245b0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
245c0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
245d0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
245e0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
245f0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
24600 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
24610 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
24620 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
24630 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
24640 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
24650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24660 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
24670 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
24680 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
24690 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
246a0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
246b0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
246c0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
246d0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
246e0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
246f0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
24700 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
24710 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
24720 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
24730 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
24740 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
24750 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
24760 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
24770 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
24780 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
24790 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
247a0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
247b0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
247c0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
247d0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
247e0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
247f0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
24800 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
24810 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
24820 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
24830 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
24840 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
24850 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
24860 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
24870 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
24880 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
24890 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
248a0 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
248b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
248c0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
248d0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
248e0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
248f0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
24900 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
24910 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
24920 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
24930 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
24940 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
24950 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
24960 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
24970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24980 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
24990 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
249a0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
249b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
249c0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
249d0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
249e0 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
249f0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
24a00 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
24a10 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
24a20 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
24a30 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
24a40 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
24a50 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
24a60 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
24a70 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
24aa0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
24ab0 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
24ac0 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
24ad0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
24ae0 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
24af0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
24b00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24b10 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
24b20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
24b30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
24b40 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
24b50 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
24b60 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
24b70 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
24b80 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
24b90 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
24ba0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
24bb0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
24bc0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
24bd0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
24be0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
24bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
24c00 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65  rn rc;.  }.  pCe
24c10 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
24c20 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a  l[0].pCell;.  sz
24c30 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
24c40 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
24c50 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65  ;.  zeroPage(pNe
24c60 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
24c70 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50  0]);.  assembleP
24c80 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
24c90 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
24ca0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24cb0 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  w = 0;..  /* Set
24cc0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
24cd0 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
24ce0 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
24cf0 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70  nt. */.  pNew->p
24d00 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
24d10 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
24d20 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
24d30 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Page);..  /* pPa
24d40 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
24d50 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
24d60 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
24d70 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
24d80 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
24d90 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
24da0 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
24db0 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
24dc0 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
24dd0 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
24de0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 67 6e 6f 72  .  **.  ** Ignor
24df0 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
24e00 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74  ue of the call t
24e10 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20  o fillInCell(). 
24e20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 2a  fillInCell().  *
24e30 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72  * may only retur
24e40 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  n other than SQL
24e50 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20  ITE_OK if it is 
24e60 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f  required to allo
24e70 63 61 74 65 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72  cate.  ** one or
24e80 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
24e90 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69  ages. Since an i
24ea0 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d  nternal table B-
24eb0 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 2a 2a 20  Tree cell .  ** 
24ec0 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c 6c 20  may never spill 
24ed0 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65  over onto an ove
24ee0 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74 20 69  rflow page (it i
24ef0 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a  s a maximum of .
24f00 20 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e    ** 13 bytes in
24f10 20 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f   size), it is no
24f20 74 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20  t neccessary to 
24f30 63 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e  check the return
24f40 20 63 6f 64 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   code..  **.  **
24f50 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20   Similarly, the 
24f60 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e  insertCell() fun
24f70 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
24f80 6c 20 69 66 20 74 68 65 20 70 61 67 65 0a 20 20  l if the page.  
24f90 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ** being inserte
24fa0 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64  d into is alread
24fb0 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74  y writable and t
24fc0 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
24fd0 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61   .  ** contain a
24fe0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74  n overflow point
24ff0 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  er. So ignore th
25000 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  is return code t
25010 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  oo..  */.  asser
25020 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
25030 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  0 );.  pCell = f
25040 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
25050 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
25060 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
25070 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
25080 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
25090 0a 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50  .  fillInCell(pP
250a0 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c  arent, parentCel
250b0 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c  l, 0, info.nKey,
250c0 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e   0, 0, 0, &paren
250d0 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
250e0 28 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20  ( parentSize<64 
250f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25100 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
25110 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
25120 62 50 61 67 65 29 20 29 3b 0a 20 20 69 6e 73 65  bPage) );.  inse
25130 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
25140 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
25150 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
25160 65 2c 20 30 2c 20 34 29 3b 0a 20 20 70 75 74 34  e, 0, 4);.  put4
25170 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
25180 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61  wCell(pParent,pa
25190 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d  rentIdx), pPage-
251a0 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79  >pgno);.  put4by
251b0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
251c0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
251d0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
251e0 77 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  w);..  /* If thi
251f0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
25200 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
25210 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
25220 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65   map.  ** with e
25230 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
25240 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
25250 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
25260 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  e .  ** cell on 
25270 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
25280 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
25290 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
252a0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20  ACUUM ){.    rc 
252b0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
252c0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
252d0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
252e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
252f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25300 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
25310 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
25320 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
25330 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25340 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
25350 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Page(pNew);.    
25360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25370 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
25380 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
25390 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
253a0 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74  ge and balance t
253b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a  he parent page,.
253c0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
253d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
253e0 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74  serted caused it
253f0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
25400 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ull..  */.  rele
25410 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
25420 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28   return balance(
25430 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23  pParent, 0);.}.#
25440 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
25450 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
25460 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
25470 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
25480 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
25490 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
254a0 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
254b0 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
254c0 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
254d0 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
254e0 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
254f0 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
25500 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
25510 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
25520 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
25530 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
25540 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
25550 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
25560 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
25570 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
25580 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
25590 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
255a0 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
255b0 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
255c0 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
255d0 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
255e0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
255f0 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
25600 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
25610 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
25620 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
25630 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
25640 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
25650 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
25660 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
25670 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
25680 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
25690 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
256a0 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
256b0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
256c0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
256d0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
256e0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
256f0 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
25700 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
25710 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
25720 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
25730 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
25740 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
25750 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
25760 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
25770 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
25780 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
25790 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
257a0 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
257b0 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
257c0 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
257d0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
257e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
257f0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
25800 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
25810 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
25820 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
25830 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
25840 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
25850 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
25860 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
25870 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
25880 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
25890 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
258a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
258b0 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
258c0 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
258d0 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
258e0 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
258f0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
25900 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
25910 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
25920 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
25930 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
25940 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
25950 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
25960 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
25970 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
25980 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
25990 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
259a0 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
259b0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
259c0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
259d0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
259e0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
259f0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
25a00 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
25a10 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
25a20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
25a30 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
25a40 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
25a50 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
25a60 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
25a70 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  oot(MemPage *pPa
25a80 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
25a90 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
25aa0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
25ab0 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
25ac0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ae0 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
25af0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
25b00 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
25b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25b20 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
25b30 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
25b40 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
25b50 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
25b60 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
25b70 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
25b80 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  . */.  int nOld;
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ba0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25bb0 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
25bc0 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  ] */.  int nNew;
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25bf0 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
25c00 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
25c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25c30 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
25c40 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
25c50 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
25c60 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
25c70 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
25c80 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
25c90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25ca0 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
25cb0 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
25cc0 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25ce0 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
25cf0 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
25d00 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
25d10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
25d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25d30 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
25d40 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
25d50 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
25d60 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
25d70 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
25d80 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
25d90 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
25da0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25db0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
25dc0 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
25dd0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
25de0 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
25df0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
25e00 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
25e10 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
25e20 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
25e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
25e40 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
25e50 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
25e60 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
25e70 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
25e80 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
25e90 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
25ea0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
25eb0 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
25ec0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
25ed0 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
25ee0 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
25ef0 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25f00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
25f10 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
25f20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69  aSpace2[] */.  i
25f30 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
25f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
25f50 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
25f60 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
25f70 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
25f80 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25f90 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
25fa0 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
25fb0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
25fc0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25fd0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25fe0 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
25ff0 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
26000 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
26010 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
26020 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
26030 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
26040 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
26050 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
26060 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
26070 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
26080 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
26090 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
260a0 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
260b0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
260c0 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
260d0 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
260e0 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
260f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26100 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
26110 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
26120 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
26130 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
26140 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
26150 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
26160 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
26170 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
26180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
26190 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
261a0 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
261b0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
261c0 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
261d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
261e0 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
261f0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
26200 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
26210 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
26220 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
26230 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
26240 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
26250 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
26260 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
26270 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
26280 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
26290 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
262a0 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
262b0 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
262c0 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
262d0 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  ce */.  u8 *aSpa
262e0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ce2 = 0;       /
262f0 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72  * Space for over
26300 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65  flow dividers ce
26310 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  lls after balanc
26320 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d  e */.  u8 *aFrom
26330 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
26340 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
26350 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
26360 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
26370 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70  .  ** Find the p
26380 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f  arent page..  */
26390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
263a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
263b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
263c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
263d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c  age->pDbPage) ||
263e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
263f0 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20  w==1 );.  pBt = 
26400 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50  pPage->pBt;.  pP
26410 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70  arent = pPage->p
26420 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74  Parent;.  assert
26430 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
26440 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
26450 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26460 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
26470 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
26480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
26490 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
264a0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
264b0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
264c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
264d0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
264e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
264f0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
26500 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
26510 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
26520 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
26530 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
26540 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
26550 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
26560 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
26570 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
26580 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
26590 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
265a0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
265b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
265c0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
265d0 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
265e0 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
265f0 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
26600 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
26610 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
26620 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
26630 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
26640 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
26650 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
26660 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
26670 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
26680 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
26690 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
266a0 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
266b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
266c0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
266d0 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
266e0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
266f0 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
26700 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
26710 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70  Page->pParent->p
26720 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20  gno!=1 &&.      
26730 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
26740 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
26750 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
26760 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29  =pPage->pgno.  )
26770 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
26780 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
26790 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     /*.    ** TOD
267a0 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62  O: Check the sib
267b0 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66  lings to the lef
267c0 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d  t of pPage. It m
267d0 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a  ay be that.    *
267e0 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66  * they are not f
267f0 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70  ull and no new p
26800 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e  age is required.
26810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
26820 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  rn balance_quick
26830 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29  (pPage, pParent)
26840 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
26850 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
26860 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26870 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26880 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
26890 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
268a0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
268b0 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61  e cell in the pa
268c0 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20  rent page whose 
268d0 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74  left child point
268e0 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70  s back.  ** to p
268f0 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22  Page.  The "idx"
26900 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
26910 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63   index of that c
26920 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20  ell.  If pPage. 
26930 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74   ** is the right
26940 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50  most child of pP
26950 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69  arent then set i
26960 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e  dx to pParent->n
26970 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28  Cell .  */.  if(
26980 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69   pParent->idxShi
26990 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  ft ){.    Pgno p
269a0 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  gno;.    pgno = 
269b0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pPage->pgno;.   
269c0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73   assert( pgno==s
269d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
269e0 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
269f0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72  Page) );.    for
26a00 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72  (idx=0; idx<pPar
26a10 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b  ent->nCell; idx+
26a20 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65  +){.      if( ge
26a30 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
26a40 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d  pParent, idx))==
26a50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
26a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26a70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
26a80 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43   idx<pParent->nC
26a90 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ell.            
26aa0 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
26ab0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
26ac0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
26ad0 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d  8])==pgno );.  }
26ae0 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20  else{.    idx = 
26af0 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
26b00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
26b10 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69   Initialize vari
26b20 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74  ables so that it
26b30 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f   will be safe to
26b40 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63   jump.  ** direc
26b50 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63  tly to balance_c
26b60 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f  leanup at any mo
26b70 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c  ment..  */.  nOl
26b80 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20  d = nNew = 0;.  
26b90 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
26ba0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
26bb0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  );..  /*.  ** Fi
26bc0 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  nd sibling pages
26bd0 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68   to pPage and th
26be0 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  e cells in pPare
26bf0 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20  nt that divide. 
26c00 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73   ** the siblings
26c10 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73  .  An attempt is
26c20 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e   made to find NN
26c30 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
26c40 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66  her.  ** side of
26c50 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69   pPage.  More si
26c60 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e  blings are taken
26c70 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20   from one side, 
26c80 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a  however, if.  **
26c90 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65   pPage there are
26ca0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
26cb0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
26cc0 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70  ther side.  If p
26cd0 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20  Parent.  ** has 
26ce0 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c  NB or fewer chil
26cf0 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68  dren then all ch
26d00 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e  ildren of pParen
26d10 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a  t are taken..  *
26d20 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20  /.  nxDiv = idx 
26d30 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69  - NN;.  if( nxDi
26d40 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74  v + NB > pParent
26d50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e  ->nCell ){.    n
26d60 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e  xDiv = pParent->
26d70 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a  nCell - NB + 1;.
26d80 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c    }.  if( nxDiv<
26d90 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  0 ){.    nxDiv =
26da0 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d   0;.  }.  nDiv =
26db0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b   0;.  for(i=0, k
26dc0 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b  =nxDiv; i<NB; i+
26dd0 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, k++){.    if(
26de0 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   k<pParent->nCel
26df0 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  l ){.      apDiv
26e00 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
26e10 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20  Parent, k);.    
26e20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20    nDiv++;.      
26e30 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74  assert( !pParent
26e40 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  ->leaf );.      
26e50 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74  pgnoOld[i] = get
26e60 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
26e70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
26e80 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
26e90 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   ){.      pgnoOl
26ea0 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
26eb0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
26ec0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
26ed0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
26ee0 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e{.      break;.
26ef0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
26f00 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
26f10 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26  t, pgnoOld[i], &
26f20 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e  apOld[i], pParen
26f30 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
26f40 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
26f50 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64  eanup;.    apOld
26f60 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  [i]->idxParent =
26f70 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   k;.    apCopy[i
26f80 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
26f90 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
26fa0 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
26fb0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
26fc0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
26fd0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
26fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
26ff0 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
27000 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
27010 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
27020 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
27030 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
27040 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
27050 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
27060 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
27070 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
27080 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
27090 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
270a0 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
270b0 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
270e0 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
270f0 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
27120 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a     + (ROUND8(siz
27130 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42  eof(MemPage))+pB
27140 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20  t->pageSize)*NB 
27150 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
27160 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
27170 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
271a0 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55     + (ISAUTOVACU
271b0 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a  UM ? nMaxCells :
271c0 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
271d0 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61   /* aFrom */.  a
271e0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
271f0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
27200 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
27210 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
27220 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
27230 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
27240 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
27250 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
27260 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
27270 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79  xCells];.  aCopy
27280 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  [0] = (u8*)&szCe
27290 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
272a0 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
272b0 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [0] - (u8*)apCel
272c0 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
272d0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
272e0 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
272f0 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69  for(i=1; i<NB; i
27300 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69  ++){.    aCopy[i
27310 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b  ] = &aCopy[i-1][
27320 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
27330 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
27340 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65  age))];.    asse
27350 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d  rt( ((aCopy[i] -
27360 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
27370 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
27380 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
27390 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61  uired */.  }.  a
273a0 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b  Space1 = &aCopy[
273b0 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
273c0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
273d0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
273e0 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
273f0 31 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  1 - (u8*)apCell)
27400 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
27410 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
27420 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
27430 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
27440 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
27450 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
27460 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70  Size];.  }.  aSp
27470 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61  ace2 = sqlite3Pa
27480 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61  geMalloc(pBt->pa
27490 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61  geSize);.  if( a
274a0 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20  Space2==0 ){.   
274b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
274c0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
274d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
274e0 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
274f0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
27500 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
27510 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
27520 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
27530 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
27540 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
27550 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
27560 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
27570 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
27580 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
27590 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
275a0 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
275b0 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
275c0 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
275d0 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
275e0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
275f0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
27600 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
27610 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
27620 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
27630 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
27640 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
27650 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
27660 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
27670 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
27680 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
27690 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
276a0 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
276b0 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
276c0 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
276d0 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
276e0 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
276f0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
27700 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
27710 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
27720 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
27730 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
27740 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
27750 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
27760 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
27770 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
27780 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
27790 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
277a0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
277b0 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
277c0 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
277d0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
277e0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
277f0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
27800 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
27810 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
27820 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
27830 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
27840 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
27850 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
27860 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
27870 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
27880 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
27890 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
278a0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
278b0 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
278c0 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
278d0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
278e0 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
278f0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
27900 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
27910 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
27920 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
27930 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
27940 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
27950 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
27960 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
27970 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
27980 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
27990 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
279a0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
279b0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
279c0 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
279d0 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
279e0 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
279f0 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
27a00 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
27a10 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
27a20 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
27a30 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
27a40 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
27a50 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
27a60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
27a70 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
27a80 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
27a90 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
27aa0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
27ab0 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
27ac0 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
27ad0 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
27ae0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
27af0 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
27b00 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  ]);.      if( IS
27b10 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
27b20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
27b30 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
27b40 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
27b50 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
27b60 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
27b70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27b80 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
27b90 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
27ba0 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
27bb0 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27bc0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
27bd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
27c00 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
27c10 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
27c20 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
27c30 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
27c40 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
27c50 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
27c60 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
27c70 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
27c80 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
27c90 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
27ca0 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
27cb0 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
27cc0 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
27cd0 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
27ce0 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
27cf0 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
27d00 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
27d10 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
27d20 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
27d30 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
27d40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
27d50 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
27d60 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
27d70 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
27d80 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
27d90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
27da0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
27db0 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
27dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27dd0 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
27de0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
27df0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27e00 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
27e10 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
27e20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
27e30 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
27e40 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
27e50 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
27e60 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
27e70 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
27e80 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
27e90 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
27ea0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e );.        mem
27eb0 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
27ec0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
27ed0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
27ee0 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
27ef0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
27f00 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
27f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
27f20 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
27f30 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  F;.        }.   
27f40 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
27f50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
27f60 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
27f70 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66  l[nCell] -= leaf
27f80 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
27f90 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
27fa0 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
27fb0 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
27fc0 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
27fd0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
27fe0 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
27ff0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
28000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
28010 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
28020 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
28030 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
28040 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
28050 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
28060 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
28070 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28080 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
28090 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
280a0 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
280b0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
280c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
280d0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
280e0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
280f0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
28100 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
28110 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
28120 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
28130 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
28140 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
28150 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
28160 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
28170 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28180 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
28190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
281a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
281b0 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
281c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
281d0 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
281e0 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
281f0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
28200 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
28210 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
28220 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
28230 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
28240 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
28250 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
28260 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
28270 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
28280 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
28290 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
282a0 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
282b0 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
282c0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
282d0 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
282e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
282f0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
28300 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
28310 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
28320 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
28330 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
28340 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
28350 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
28360 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
28370 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
28380 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
28390 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
283a0 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
283b0 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
283c0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
283d0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
283e0 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
283f0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
28400 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
28410 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
28420 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
28430 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
28440 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
28450 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
28460 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
28470 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
28480 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
28490 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
284a0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
284b0 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
284c0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
284d0 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
284e0 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
284f0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
28500 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
28510 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
28520 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
28530 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
28540 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
28550 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
28560 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
28570 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
28580 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
28590 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
285a0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
285b0 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
285c0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
285d0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
285e0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
285f0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
28600 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
28610 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
28620 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
28630 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
28640 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
28650 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
28660 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
28670 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
28680 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
28690 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
286a0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
286b0 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
286c0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
286d0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
286e0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
286f0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
28700 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
28710 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
28720 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
28730 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
28740 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
28750 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
28760 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
28770 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
28780 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
28790 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
287a0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
287b0 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
287c0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
287d0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
287e0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
287f0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
28800 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
28810 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
28820 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
28830 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
28840 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
28850 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
28860 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
28870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28880 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
28890 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
288a0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
288b0 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
288c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
288d0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
288e0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
288f0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
28900 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
28910 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
28920 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
28930 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
28940 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
28950 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
28960 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
28970 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
28980 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
28990 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
289a0 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
289b0 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
289c0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
289d0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
289e0 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
289f0 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
28a00 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
28a10 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
28a20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
28a30 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
28a40 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
28a50 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
28a60 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
28a70 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
28a80 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
28a90 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
28aa0 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
28ab0 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
28ac0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
28ad0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28ae0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
28af0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
28b00 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
28b10 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
28b20 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
28b30 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
28b40 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
28b50 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
28b60 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
28b70 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
28b80 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
28b90 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
28ba0 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
28bb0 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
28bc0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28bd0 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
28be0 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
28bf0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
28c00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
28c10 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
28c20 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
28c30 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
28c40 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
28c50 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
28c60 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
28c70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
28c80 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
28c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28ca0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
28cb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28cc0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
28cd0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28ce0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28d00 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
28d10 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
28d20 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
28d30 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
28d40 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
28d50 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
28d60 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
28d70 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28d80 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
28d90 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
28da0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28db0 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
28dc0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
28dd0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
28de0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
28df0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
28e00 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
28e10 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
28e20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28e30 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
28e40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
28e50 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
28e60 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
28e70 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
28e80 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
28e90 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
28ea0 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
28eb0 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
28ec0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
28ed0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
28ee0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
28ef0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
28f00 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
28f10 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
28f20 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
28f30 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
28f40 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
28f50 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
28f60 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
28f70 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
28f80 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
28f90 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
28fa0 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
28fb0 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
28fc0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
28fd0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
28fe0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
28ff0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
29000 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
29010 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
29020 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
29030 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
29040 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
29050 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
29060 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
29070 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
29080 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
29090 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
290a0 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
290b0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
290c0 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
290d0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
290e0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
290f0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
29100 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
29110 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
29120 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
29130 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
29140 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
29150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
29160 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
29170 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
29180 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
29190 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
291a0 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
291b0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
291c0 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
291d0 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
291e0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
291f0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
29200 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
29210 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
29220 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
29230 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
29240 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
29250 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
29260 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
29270 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
29280 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
29290 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
292a0 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
292b0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
292c0 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
292d0 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
292e0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
292f0 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
29300 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
29310 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
29320 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
29330 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
29340 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
29350 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
29360 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
29370 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
29380 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
29390 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
293a0 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
293b0 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
293c0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
293d0 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
293e0 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
293f0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
29400 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
29410 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
29420 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
29430 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
29440 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
29450 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
29460 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
29470 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
29480 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
29490 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
294a0 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
294b0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
294c0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
294d0 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
294e0 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
294f0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
29500 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
29510 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
29520 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
29530 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
29540 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
29550 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
29560 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
29570 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
29580 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
29590 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
295a0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
295b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
295c0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
295d0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
295e0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
295f0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
29600 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
29610 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
29620 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
29630 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
29640 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
29650 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
29660 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
29670 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
29680 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
29690 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
296a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
296b0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
296c0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
296d0 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
296e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
296f0 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
29700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
29710 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
29720 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
29730 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
29740 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
29750 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
29760 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
29770 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29780 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65  =SQLITE_OK && le
29790 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
297a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
297b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
297c0 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
297d0 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[k]), PTRMAP_B
297e0 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
297f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29800 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
29810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29820 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
29830 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
29840 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29860 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74    }..    j = cnt
29870 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
29880 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
29890 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
298a0 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
298b0 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
298c0 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
298d0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
298e0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
298f0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
29900 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
29910 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
29920 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
29930 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
29940 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
29950 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
29960 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
29970 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
29980 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
29990 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
299a0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
299b0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
299c0 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20  2[iSpace2];.    
299d0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
299e0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
299f0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
29a00 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
29a10 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
29a20 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20  TOVACUUM .      
29a30 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d     && (aFrom[j]=
29a40 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
29a50 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[j]]->pgno!
29a60 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20  =pNew->pgno).   
29a70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29a80 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29a90 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
29aa0 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54  Cell), PTRMAP_BT
29ab0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
29ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29af0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
29b00 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
29b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29b20 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
29b30 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
29b40 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
29b50 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
29b60 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
29b70 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
29b80 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
29b90 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
29ba0 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
29bb0 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
29bc0 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
29bd0 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
29be0 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
29bf0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
29c00 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
29c10 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
29c20 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
29c30 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
29c40 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
29c50 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
29c60 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
29c70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  --;.        sqli
29c80 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
29c90 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
29ca0 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
29cb0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
29cc0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c  emp;.        fil
29cd0 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
29ce0 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
29cf0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
29d00 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  sz);.        pTe
29d10 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
29d20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
29d30 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
29d40 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
29d50 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
29d60 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
29d70 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
29d80 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
29d90 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
29da0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
29db0 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
29dc0 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
29dd0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
29de0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
29df0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
29e00 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
29e10 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
29e20 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
29e30 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
29e40 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
29e50 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
29e60 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
29e70 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
29e80 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
29e90 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
29ea0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
29eb0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
29ec0 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
29ed0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29ee0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
29ef0 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
29f00 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
29f10 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
29f20 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
29f30 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
29f40 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
29f50 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
29f60 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
29f70 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
29f80 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
29f90 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
29fa0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
29fb0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
29fc0 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
29fd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
29fe0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
29ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
2a000 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2a010 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
2a020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a030 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b  .      iSpace2 +
2a040 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
2a050 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
2a060 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
2a070 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32   assert( iSpace2
2a080 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
2a090 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
2a0a0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2a0b0 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
2a0c0 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
2a0d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a0e0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
2a0f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2a100 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2a110 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2a120 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70  Parent,nxDiv), p
2a130 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  New->pgno);..   
2a140 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2a150 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2a160 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f  database, and no
2a170 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  t a leaf-data tr
2a180 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ee,.      ** the
2a190 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  n update the poi
2a1a0 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e  nter map with an
2a1b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
2a1c0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
2a1d0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63     ** that the c
2a1e0 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65  ell just inserte
2a1f0 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20  d points to (if 
2a200 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
2a210 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2a220 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61  ACUUM && !leafDa
2a230 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
2a240 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2a250 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2a260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2a270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a280 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2a290 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2a2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2a2b0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
2a2c0 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
2a2d0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2a2e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2a2f0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
2a300 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
2a310 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2a320 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2a330 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2a340 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
2a350 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2a360 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
2a370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a390 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2a3a0 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
2a3b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2a3c0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
2a3d0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
2a3e0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
2a3f0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
2a400 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
2a410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
2a420 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
2a430 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
2a440 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
2a450 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
2a460 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
2a470 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41   4);.    if( ISA
2a480 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2a490 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2a4a0 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
2a4b0 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f  zChild), PTRMAP_
2a4c0 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65  BTREE, apNew[nNe
2a4d0 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  w-1]->pgno);.   
2a4e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a500 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a510 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2a520 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78    }.  }.  if( nx
2a530 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
2a540 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
2a550 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
2a560 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2a570 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
2a580 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
2a590 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
2a5a0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2a5b0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2a5c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2a5d0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2a5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2a5f0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2a600 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
2a610 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
2a620 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
2a630 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
2a640 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
2a650 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
2a660 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2a670 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2a680 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
2a690 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2a6a0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52    }..  /*.  ** R
2a6b0 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72 65 6e  eparent children
2a6c0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20   of all cells.. 
2a6d0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2a6e0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
2a6f0 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
2a700 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77 5b 69  ildPages(apNew[i
2a710 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  ], 0);.    if( r
2a720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2a730 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2a740 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nup;.  }.  rc = 
2a750 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
2a760 65 73 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  es(pParent, 0);.
2a770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a780 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
2a790 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f  ce_cleanup;..  /
2a7a0 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74  *.  ** Balance t
2a7b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
2a7c0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63   Note that the c
2a7d0 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61  urrent page (pPa
2a7e0 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68  ge) might.  ** h
2a7f0 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74  ave been added t
2a800 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73  o the freelist s
2a810 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f  o it might no lo
2a820 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69  nger be initiali
2a830 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68  zed..  ** But th
2a840 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69  e parent page wi
2a850 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69  ll always be ini
2a860 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
2a870 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
2a880 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73 71  ->isInit );.  sq
2a890 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
2a8a0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65  (apCell);.  apCe
2a8b0 6c 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 62  ll = 0;.  rc = b
2a8c0 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
2a8d0 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
2a8e0 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
2a8f0 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
2a900 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
2a910 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
2a920 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73  ee(aSpace2);.  s
2a930 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2a940 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
2a950 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2a960 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2a970 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2a980 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2a990 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2a9a0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
2a9b0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  w[i]);.  }.  rel
2a9c0 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
2a9d0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
2a9e0 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77  ANCE: finished w
2a9f0 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e  ith %d: old=%d n
2aa00 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
2aa10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ",.          pPa
2aa20 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20  ge->pgno, nOld, 
2aa30 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20  nNew, nCell));. 
2aa40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2aa50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2aa60 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
2aa70 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2aa80 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74 68   a btree when th
2aa90 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63  e root.** page c
2aaa0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
2aab0 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
2aac0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b  portunity to mak
2aad0 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68  e the tree.** sh
2aae0 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c  allower by one l
2aaf0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
2ab00 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  int balance_shal
2ab10 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  lower(MemPage *p
2ab20 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
2ab30 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20   *pChild;       
2ab40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
2ab50 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20  y child page of 
2ab60 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  pPage */.  Pgno 
2ab70 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
2ab80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2ab90 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c  number for pChil
2aba0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  d */.  int rc = 
2abb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2abc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2abd0 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
2abe0 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61  dures */.  BtSha
2abf0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
2ac00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ac10 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72  e main BTree str
2ac20 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
2ac30 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20  mxCellPerPage;  
2ac40 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2ac50 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  mum number of ce
2ac60 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a  lls per page */.
2ac70 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac90 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d  * All cells from
2aca0 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c   pages being bal
2acb0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2acc0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2acd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2ace0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2acf0 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ls */..  assert(
2ad00 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2ad10 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2ad20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2ad30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ad40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ad50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2ad60 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  x) );.  pBt = pP
2ad70 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65  age->pBt;.  mxCe
2ad80 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43  llPerPage = MX_C
2ad90 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65  ELL(pBt);.  apCe
2ada0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
2adb0 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  oc( mxCellPerPag
2adc0 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73  e*(sizeof(u8*)+s
2add0 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20  izeof(u16)) );. 
2ade0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2adf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ae00 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  OMEM;.  szCell =
2ae10 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d   (u16*)&apCell[m
2ae20 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20  xCellPerPage];. 
2ae30 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2ae40 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
2ae50 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
2ae60 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  ly empty */.    
2ae70 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2ae80 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c   empty table %d\
2ae90 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
2aea0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2aeb0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
2aec0 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61   is empty but ha
2aed0 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72  s one child.  Tr
2aee0 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a  ansfer the.    *
2aef0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
2af00 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c  om that one chil
2af10 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  d into the root 
2af20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20  page if it .    
2af30 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68  ** will fit.  Th
2af40 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64  is reduces the d
2af50 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
2af60 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a   by one..    **.
2af70 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f      ** If the ro
2af80 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
2af90 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
2afa0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
2afb0 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63  han.    ** its c
2afc0 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65  hild (due to the
2afd0 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72   100 byte header
2afe0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
2aff0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
2b000 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
2b010 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
2b020 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
2b030 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
2b040 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e  f the .    ** in
2b050 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
2b060 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
2b070 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
2b080 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20  this is the .   
2b090 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64   ** case, then d
2b0a0 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61  o not do the tra
2b0b0 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61  nsfer.  Leave pa
2b0c0 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70  ge 1 empty excep
2b0d0 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
2b0e0 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74   right-pointer t
2b0f0 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  o the child page
2b100 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67  .  The child pag
2b110 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a  e becomes.    **
2b120 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
2b130 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20  t of the tree.. 
2b140 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68     */.    pgnoCh
2b150 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
2b160 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2b170 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2b180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2b190 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20  gnoChild>0 );.  
2b1a0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
2b1b0 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ild<=pagerPageco
2b1c0 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  unt(pPage->pBt->
2b1d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
2b1e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b1f0 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e 70  GetPage(pPage->p
2b200 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26  Bt, pgnoChild, &
2b210 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20  pChild, 0);.    
2b220 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2b230 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2b240 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
2b250 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ->pgno==1 ){.   
2b260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2b270 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2b280 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 20  ild, pPage);.   
2b290 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2b2a0 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2b2b0 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65  ance;.      asse
2b2c0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  rt( pChild->nOve
2b2d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20  rflow==0 );.    
2b2e0 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46    if( pChild->nF
2b2f0 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20  ree>=100 ){.    
2b300 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2b310 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c   information wil
2b320 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2b330 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68  t page, so do th
2b340 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  e.        ** cop
2b350 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  y */.        int
2b360 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f   i;.        zero
2b370 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2b380 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  ld->aData[0]);. 
2b390 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2b3a0 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2b3b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2b3c0 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e   apCell[i] = fin
2b3d0 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b  dCell(pChild,i);
2b3e0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c  .          szCel
2b3f0 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  l[i] = cellSizeP
2b400 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c  tr(pChild, apCel
2b410 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
2b420 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c  .        assembl
2b430 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  ePage(pPage, pCh
2b440 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65  ild->nCell, apCe
2b450 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  ll, szCell);.   
2b460 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65       /* Copy the
2b470 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f   right-pointer o
2b480 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74  f the child to t
2b490 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  he parent. */.  
2b4a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2b4b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2b4c0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2b4d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
2b4e0 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
2b4f0 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
2b500 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2b510 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28         freePage(
2b520 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  pChild);.       
2b530 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2b540 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73  : child %d trans
2b550 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22  fer to page 1\n"
2b560 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2b570 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
2b590 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66  ild has more inf
2b5a0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
2b5b0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2b5c0 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54  ot..        ** T
2b5d0 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61  he tree is alrea
2b5e0 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f  dy balanced.  Do
2b5f0 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20   nothing. */.   
2b600 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2b610 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77  ANCE: child %d w
2b620 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70  ill not fit on p
2b630 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2b640 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2b650 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b660 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d     memcpy(pPage-
2b670 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e  >aData, pChild->
2b680 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42  aData, pPage->pB
2b690 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
2b6a0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49        pPage->isI
2b6b0 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nit = 0;.      p
2b6c0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
2b6d0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2b6e0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2b6f0 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
2b700 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2b710 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2b720 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
2b730 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45  ld);.      TRACE
2b740 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e  (("BALANCE: tran
2b750 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e  sfer child %d in
2b760 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20  to root %d\n",. 
2b770 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68               pCh
2b780 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65  ild->pgno, pPage
2b790 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  ->pgno));.    }.
2b7a0 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
2b7b0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 67  tChildPages(pPag
2b7c0 65 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  e, 1);.    asser
2b7d0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2b7e0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  low==0 );.    if
2b7f0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2b800 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
2b810 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2b820 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2b830 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20  +){ .        rc 
2b840 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2b850 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
2b860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b880 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c    goto end_shall
2b890 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2b8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b8b0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
2b8c0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2b8d0 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c  .end_shallow_bal
2b8e0 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f  ance:.  sqlite3_
2b8f0 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  free(apCell);.  
2b900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2b910 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
2b920 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a  ge is overfull.*
2b930 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68  *.** When this h
2b940 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61  appens, Create a
2b950 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2b960 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20  and copy the.** 
2b970 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b980 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68  root into the ch
2b990 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20  ild.  Then make 
2b9a0 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2b9b0 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
2b9c0 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70  ith rightChild p
2b9d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
2b9e0 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46  ew.** child.   F
2b9f0 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c  inally, call bal
2ba00 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20  ance_internal() 
2ba10 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  on the new child
2ba20 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20  .** to cause it 
2ba30 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61  to split..*/.sta
2ba40 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2ba50 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a  deeper(MemPage *
2ba60 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  pPage){.  int rc
2ba70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ba80 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
2ba90 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2baa0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2bab0 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50 6f 69  Child;    /* Poi
2bac0 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68  nter to a new ch
2bad0 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  ild page */.  Pg
2bae0 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
2baf0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2bb00 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
2bb10 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
2bb20 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
2bb30 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
2bb40 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
2bb50 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  ize;     /* Tota
2bb60 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  l usable size of
2bb70 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20   a page */.  u8 
2bb80 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
2bb90 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2bba0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 2a  he parent page *
2bbb0 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b 20 20  /.  u8 *cdata;  
2bbc0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2bbd0 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  nt of the child 
2bbe0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  page */.  int hd
2bbf0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
2bc00 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67 65 20   Offset to page 
2bc10 68 65 61 64 65 72 20 69 6e 20 70 61 72 65 6e 74  header in parent
2bc20 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
2bc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2bc40 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74 20 6f  set to content o
2bc50 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20  f first cell in 
2bc60 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  parent */..  ass
2bc70 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
2bc80 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
2bc90 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2bca0 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42 74 20  flow>0 );.  pBt 
2bcb0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2bcc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2bcd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2bce0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
2bcf0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2bd00 67 65 28 70 42 74 2c 20 26 70 43 68 69 6c 64 2c  ge(pBt, &pChild,
2bd10 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20 70 50 61   &pgnoChild, pPa
2bd20 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  ge->pgno, 0);.  
2bd30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2bd40 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
2bd50 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2bd60 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
2bd70 62 50 61 67 65 29 20 29 3b 0a 20 20 75 73 61 62  bPage) );.  usab
2bd80 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
2bd90 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61  ableSize;.  data
2bda0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2bdb0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2bdc0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 62 72  hdrOffset;.  cbr
2bdd0 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
2bde0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 63 64  ta[hdr+5]);.  cd
2bdf0 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e 61 44  ata = pChild->aD
2be00 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28 63 64  ata;.  memcpy(cd
2be10 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72 5d 2c  ata, &data[hdr],
2be20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2be30 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  et+2*pPage->nCel
2be40 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63 70 79  l-hdr);.  memcpy
2be50 28 26 63 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  (&cdata[cbrk], &
2be60 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62  data[cbrk], usab
2be70 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b 0a 20 20  leSize-cbrk);.  
2be80 69 66 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e  if( pChild->isIn
2be90 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
2bea0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 63  TE_CORRUPT;.  rc
2beb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2bec0 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
2bed0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
2bee0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2bef0 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d  eeper_out;.  mem
2bf00 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
2bf10 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
2bf20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2bf30 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
2bf40 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
2bf50 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2bf60 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2bf70 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64  ow;.  if( pChild
2bf80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2bf90 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
2bfa0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
2bfb0 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
2bfc0 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
2bfd0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
2bfe0 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2bff0 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
2c000 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
2c010 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2c020 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2c030 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2c040 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2c050 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
2c060 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
2c070 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
2c080 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 49 53 41  gno));.  if( ISA
2c090 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2c0a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63 20 3d   int i;.    rc =
2c0b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2c0c0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
2c0d0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
2c0e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  e->pgno);.    if
2c0f0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2c100 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2c110 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2c120 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2c130 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
2c140 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43 68 69  rmapPutOvfl(pChi
2c150 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ld, i);.      if
2c160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c170 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
2c180 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2c190 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2c1a0 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
2c1b0 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 43 68  ntChildPages(pCh
2c1c0 69 6c 64 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  ild, 1);.  }.  i
2c1d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c1e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
2c1f0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68  ance_nonroot(pCh
2c200 69 6c 64 29 3b 0a 20 20 7d 0a 0a 62 61 6c 61 6e  ild);.  }..balan
2c210 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20  cedeeper_out:.  
2c220 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2c230 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ld);.  return rc
2c240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64  ;.}../*.** Decid
2c250 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50  e if the page pP
2c260 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
2c270 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61  balanced.  If ba
2c280 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65  lancing is.** re
2c290 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65  quired, call the
2c2a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2c2b0 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  ancing routine..
2c2c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2c2d0 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  lance(MemPage *p
2c2e0 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74  Page, int insert
2c2f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2c300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2c310 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2c320 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2c330 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2c340 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
2c350 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2c360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c370 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c380 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2c3a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2c3b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2c3c0 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
2c3d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2c3e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c3f0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2c400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2c410 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2c420 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
2c430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2c440 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c450 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ow>0 || .       
2c460 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61   (!insert && pPa
2c470 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d  ge->nFree>pPage-
2c480 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2c490 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72  *2/3) ){.      r
2c4a0 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2c4b0 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20  oot(pPage);.    
2c4c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2c4d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2c4e0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
2c4f0 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74  all cursors that
2c500 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20   point to table 
2c510 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20  pgnoRoot..** If 
2c520 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72  any of those cur
2c530 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64  sors were opened
2c540 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
2c550 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  in a different.*
2c560 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2c570 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73  ction (a databas
2c580 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  e connection tha
2c590 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67  t shares the pag
2c5a0 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68  er.** cache with
2c5b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2c5c0 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61  nection) and tha
2c5d0 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  t other connecti
2c5e0 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  on .** is not in
2c5f0 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d   the ReadUncommm
2c600 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65  itted state, the
2c610 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
2c620 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
2c630 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20  E_LOCKED..**.** 
2c640 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f  As well as curso
2c650 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  rs with wrFlag==
2c660 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  0, cursors with 
2c670 77 72 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a  wrFlag==1 and .*
2c680 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  * isIncrblobHand
2c690 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63  le==1 are also c
2c6a0 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61 64 27  onsidered 'read'
2c6b0 20 63 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d   cursors. Increm
2c6c0 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63  ental .** blob c
2c6d0 75 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20  ursors are used 
2c6e0 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67  for both reading
2c6f0 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a   and writing..**
2c700 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f  .** When pgnoRoo
2c710 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
2c720 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20  ge of an intkey 
2c730 74 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63  table, this func
2c740 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20  tion is also.** 
2c750 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2c760 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63  invalidating inc
2c770 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
2c780 72 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74  rsors when the t
2c790 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77  able row.** on w
2c7a0 68 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70  hich they are op
2c7b0 65 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20  ened is deleted 
2c7c0 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72  or modified. Cur
2c7d0 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
2c7e0 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  ated.** accordin
2c7f0 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  g to the followi
2c800 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ng rules:.**.** 
2c810 20 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43    1) When BtreeC
2c820 6c 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63  learTable() is c
2c830 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74  alled to complet
2c840 65 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63  ely delete the c
2c850 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20  ontents.**      
2c860 6f 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c  of a B-Tree tabl
2c870 65 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73  e, pExclude is s
2c880 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70  et to zero and p
2c890 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73  arameter iRow is
2c8a0 20 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f   .**      set to
2c8b0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
2c8c0 69 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72  is case all incr
2c8d0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
2c8e0 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20  sors open.**    
2c8f0 20 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72    on the table r
2c900 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f  ooted at pgnoRoo
2c910 74 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  t are invalidate
2c920 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  d..**.**   2) Wh
2c930 65 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  en BtreeInsert()
2c940 2c 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  , BtreeDelete() 
2c950 6f 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28  or BtreePutData(
2c960 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a  ) is called to .
2c970 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61  **      modify a
2c980 20 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61   table row via a
2c990 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  n SQL statement,
2c9a0 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2c9b0 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   to the .**     
2c9c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73   write cursor us
2c9d0 65 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64  ed to do the mod
2c9e0 69 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61  ification and pa
2c9f0 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
2ca00 73 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  set.**      to t
2ca10 68 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69  he integer row i
2ca20 64 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  d of the B-Tree 
2ca30 65 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69  entry being modi
2ca40 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20  fied. Unless.** 
2ca50 20 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73       pExclude is
2ca60 20 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65   itself an incre
2ca70 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2ca80 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63  or, then all inc
2ca90 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20  remental.**     
2caa0 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70   blob cursors op
2cab0 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f  en on row iRow o
2cac0 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65  f the B-Tree are
2cad0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a   invalidated..**
2cae0 0a 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68  .**   3) If both
2caf0 20 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52   pExclude and iR
2cb00 6f 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65  ow are set to ze
2cb10 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74  ro, no increment
2cb20 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20  al blob .**     
2cb30 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
2cb40 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  alidated..*/.sta
2cb50 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
2cb60 64 4c 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20  dLocks(.  Btree 
2cb70 2a 70 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f  *pBtree, .  Pgno
2cb80 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74   pgnoRoot, .  Bt
2cb90 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
2cba0 2c 0a 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a  ,.  i64 iRow.){.
2cbb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
2cbc0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2cbd0 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20   pBtree->pBt;.  
2cbe0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42  sqlite3 *db = pB
2cbf0 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65  tree->db;.  asse
2cc00 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2cc10 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65  HoldsMutex(pBtre
2cc20 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  e) );.  for(p=pB
2cc30 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
2cc40 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
2cc50 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20  if( p==pExclude 
2cc60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2cc70 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21  if( p->pgnoRoot!
2cc80 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74  =pgnoRoot ) cont
2cc90 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  inue;.#ifndef SQ
2cca0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2ccb0 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  OB.    if( p->is
2ccc0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
2ccd0 26 20 28 20 0a 20 20 20 20 20 20 20 20 20 28 21  & ( .         (!
2cce0 70 45 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77  pExclude && iRow
2ccf0 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63  ).      || (pExc
2cd00 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c 75 64  lude && !pExclud
2cd10 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  e->isIncrblobHan
2cd20 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e  dle && p->info.n
2cd30 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29  Key==iRow).    )
2cd40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
2cd50 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2cd60 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  LID;.    }.#endi
2cd70 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74  f.    if( p->eSt
2cd80 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cd90 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  D ) continue;.  
2cda0 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d    if( p->wrFlag=
2cdb0 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  =0 .#ifndef SQLI
2cdc0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2cdd0 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e  .     || p->isIn
2cde0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e  crblobHandle.#en
2cdf0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
2ce00 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65   sqlite3 *dbOthe
2ce10 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64  r = p->pBtree->d
2ce20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f  b;.      if( dbO
2ce30 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  ther==0 ||.     
2ce40 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62      (dbOther!=db
2ce50 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c   && (dbOther->fl
2ce60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2ce70 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30  dUncommitted)==0
2ce80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2ce90 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2cea0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
2ceb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2cec0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2ced0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
2cee0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
2cef0 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
2cf00 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
2cf10 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
2cf20 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
2cf30 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
2cf40 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
2cf50 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
2cf60 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
2cf70 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
2cf80 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
2cf90 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
2cfa0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
2cfb0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
2cfc0 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
2cfd0 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
2cfe0 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
2cff0 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
2d000 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
2d010 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
2d020 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
2d030 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
2d040 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
2d050 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
2d060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d070 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42  BtreeInsert(.  B
2d080 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d0a0 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74   Insert data int
2d0b0 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74  o the table of t
2d0c0 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
2d0d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
2d0e0 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
2d0f0 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65  * The key of the
2d100 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2d110 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2d120 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  ta, int nData,  
2d130 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20 74  /* The data of t
2d140 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f  he new record */
2d150 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2d180 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f 20  xtra 0 bytes to 
2d190 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a  append to data *
2d1a0 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69  /.  int appendBi
2d1b0 61 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  as              
2d1c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d1d0 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20  is is likely an 
2d1e0 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  append */.){.  i
2d1f0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
2d200 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
2d210 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d220 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2d230 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2d240 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2d250 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
2d260 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
2d270 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2d280 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
2d290 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2d2a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2d2b0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
2d2c0 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41  Transaction!=TRA
2d2d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2d2e0 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20  /* Must start a 
2d2f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
2d300 72 65 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65  re doing an inse
2d310 72 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  rt */.    rc = p
2d320 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2d330 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2d340 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d350 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d360 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2d370 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
2d380 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2d390 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2d3a0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2d3b0 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65  * Cursor not ope
2d3c0 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  n for writing */
2d3d0 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2d3e0 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2d3f0 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2d400 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b  noRoot, pCur, nK
2d410 65 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ey) ){.    retur
2d420 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2d430 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2d440 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2d450 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2d460 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2d470 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
2d480 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
2d490 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
2d4a0 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
2d4b0 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
2d4c0 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  ny other cursors
2d4d0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61   open on this ta
2d4e0 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75  ble */.  clearCu
2d4f0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2d500 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
2d510 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2d520 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2d530 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2d540 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
2d550 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2d560 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2d570 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
2d580 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
2d590 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
2d5a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d5b0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2d5c0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2d5d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2d5e0 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2d5f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d600 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2d610 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52  ->intKey );.  TR
2d620 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2d630 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2d640 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2d650 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2d660 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2d670 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2d680 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2d690 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2d6a0 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2d6b0 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2d6c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2d6d0 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
2d6e0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
2d6f0 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
2d700 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
2d710 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
2d720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d730 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
2d740 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
2d750 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
2d760 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
2d770 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
2d780 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2d790 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2d7a0 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
2d7b0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2d7c0 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
2d7d0 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
2d7e0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2d7f0 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30   );.  if( loc==0
2d800 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   && CURSOR_VALID
2d810 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2d820 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
2d830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2d840 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
2d850 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
2d860 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
2d870 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d880 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2d890 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2d8a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2d8b0 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
2d8c0 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
2d8d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2d8e0 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  ->idx);.    if( 
2d8f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d900 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
2d910 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
2d920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
2d930 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
2d940 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2d950 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
2d960 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
2d970 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2d980 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2d990 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  rt;.    dropCell
2d9a0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2d9b0 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c  x, szOld);.  }el
2d9c0 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
2d9d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2d9e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2d9f0 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
2da00 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
2da10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2da20 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
2da30 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
2da40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2da50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2da60 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  f );.  }.  rc = 
2da70 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2da80 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77  , pCur->idx, new
2da90 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
2daa0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2dab0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
2dac0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20  nd_insert;.  rc 
2dad0 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2dae0 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   1);.  if( rc==S
2daf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2db00 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2db10 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74  ;.  }.end_insert
2db20 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
2db30 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
2db40 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
2db50 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
2db60 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75  ting to.  The cu
2db70 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
2db80 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
2db90 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
2dba0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2dbb0 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
2dbc0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2dbd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2dbe0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69  r->pPage;.  unsi
2dbf0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2dc00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  ;.  int rc;.  Pg
2dc10 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30  no pgnoChild = 0
2dc20 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
2dc30 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
2dc40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2dc50 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2dc60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2dc70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2dc80 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2dc90 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74  nit );.  if( pBt
2dca0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2dcb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2dcc0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2dcd0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2dce0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64  before doing a d
2dcf0 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20  elete */.    rc 
2dd00 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2dd10 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2dd20 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2dd30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2dd40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2dd50 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2dd60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2dd70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2dd80 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
2dd90 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2dda0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20    if( pCur->idx 
2ddb0 3e 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  >= pPage->nCell 
2ddc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ddd0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20  LITE_ERROR;  /* 
2dde0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  The cursor is no
2ddf0 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e  t pointing to an
2de00 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
2de10 69 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61  if( !pCur->wrFla
2de20 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
2de30 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f  SQLITE_PERM;   /
2de40 2a 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74  * Did not open t
2de50 68 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77  his cursor for w
2de60 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  riting */.  }.  
2de70 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
2de80 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c  ks(pCur->pBtree,
2de90 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2dea0 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66   pCur, pCur->inf
2deb0 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  o.nKey) ){.    r
2dec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2ded0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2dee0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2def0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2df00 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   */.  }..  /* Re
2df10 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
2df20 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2df30 6e 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  n (a no-op if th
2df40 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2df50 69 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f  in .  ** CURSOR_
2df60 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74  REQUIRESEEK stat
2df70 65 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20  e) and save the 
2df80 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2df90 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a   other cursors .
2dfa0 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65    ** open on the
2dfb0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65   same table. The
2dfc0 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  n call sqlite3Pa
2dfd0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
2dfe0 65 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74  e page.  ** that
2dff0 20 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20   the entry will 
2e000 62 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e  be deleted from.
2e010 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2e020 20 28 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75   (rc = restoreCu
2e030 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2e040 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
2e050 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2e060 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2e070 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d  noRoot, pCur))!=
2e080 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2e090 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e0a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e0b0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65  )!=0.  ){.    re
2e0c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
2e0d0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65  /* Locate the ce
2e0e0 6c 6c 20 77 69 74 68 69 6e 20 69 74 73 20 70 61  ll within its pa
2e0f0 67 65 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65  ge and leave pCe
2e100 6c 6c 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ll pointing to t
2e110 68 65 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68  he.  ** data. Th
2e120 65 20 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61  e clearCell() ca
2e130 6c 6c 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65  ll frees any ove
2e140 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2e150 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
2e160 20 20 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63    ** cell. The c
2e170 65 6c 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74  ell itself is st
2e180 69 6c 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f  ill intact..  */
2e190 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
2e1a0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2e1b0 3e 69 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50  >idx);.  if( !pP
2e1c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e1d0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2e1e0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
2e1f0 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  }.  rc = clearCe
2e200 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
2e210 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2e220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e230 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
2e240 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  leaf ){.    /*. 
2e250 20 20 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20     ** The entry 
2e260 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2e270 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20  delete is not a 
2e280 6c 65 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f  leaf so if we do
2e290 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73   not.    ** do s
2e2a0 6f 6d 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c  omething we will
2e2b0 20 6c 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e   leave a hole on
2e2c0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67   an internal pag
2e2d0 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76  e..    ** We hav
2e2e0 65 20 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f  e to fill the ho
2e2f0 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20  le by moving in 
2e300 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  a cell from a le
2e310 61 66 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  af.  The.    ** 
2e320 6e 65 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20  next Cell after 
2e330 74 68 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65  the one to be de
2e340 6c 65 74 65 64 20 69 73 20 67 75 61 72 61 6e 74  leted is guarant
2e350 65 65 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64  eed to exist and
2e360 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20  .    ** to be a 
2e370 6c 65 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75  leaf so we can u
2e380 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
2e390 20 20 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43    BtCursor leafC
2e3a0 75 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ur;.    unsigned
2e3b0 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20   char *pNext;.  
2e3c0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
2e3d0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2e3e0 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a   *tempCell = 0;.
2e3f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2e400 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
2e410 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
2e420 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
2e430 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  , &leafCur);.   
2e440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e450 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
2e460 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
2e470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e480 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2e490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e4a0 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  e(leafCur.pPage-
2e4b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2e4c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2e4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e4e0 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20  u16 szNext;.    
2e4f0 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2e500 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2e510 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2e520 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2e530 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2e540 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2e550 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2e560 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2e570 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2e580 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2e590 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2e5a0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2e5b0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2e5c0 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2e5d0 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2e5e0 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2e5f0 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2e600 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2e610 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2e620 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2e630 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2e640 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61  ext+4 );.      a
2e650 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
2e660 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d  (pBt);.      tem
2e670 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  pCell = pBt->pTm
2e680 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66  pSpace;.      if
2e690 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b  ( tempCell==0 ){
2e6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2e6b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2e6c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2e6d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e6e0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65         rc = inse
2e6f0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2e700 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34  ur->idx, pNext-4
2e710 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70  , szNext+4, temp
2e720 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cell, 0);.      
2e730 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2e740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e750 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2e760 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2e770 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2e780 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2e790 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2e7a0 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2e7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e7c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e7d0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
2e7e0 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2e7f0 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a   leafCur.idx, sz
2e800 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Next);.        r
2e810 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66  c = balance(leaf
2e820 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20  Cur.pPage, 0);. 
2e830 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e840 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
2e850 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2e860 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73  leafCur);.  }els
2e870 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44  e{.    TRACE(("D
2e880 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2e890 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66  delete from leaf
2e8a0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70   %d\n",.       p
2e8b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2e8c0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2e8d0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2e8e0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c  , pCur->idx, cel
2e8f0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2e900 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20  pCell));.    rc 
2e910 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2e920 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2e930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e940 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2e950 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2e960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e970 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2e980 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2e990 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2e9a0 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2e9b0 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2e9c0 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2e9d0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2e9e0 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2e9f0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2ea00 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2ea10 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2ea20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2ea30 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2ea40 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2ea50 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2ea60 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2ea70 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2ea80 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2ea90 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2eaa0 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2eab0 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2eac0 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2ead0 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaf0 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2eb00 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
2eb10 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
2eb20 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2eb30 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2eb40 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2eb50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2eb60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2eb70 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2eb80 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
2eb90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2eba0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2ebb0 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  (p) );.  if( pBt
2ebc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2ebd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2ebe0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2ebf0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2ec00 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20  first */.    rc 
2ec10 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2ec20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2ec30 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2ec40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2ec50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2ec60 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2ec70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2ec80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2ec90 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2eca0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2ecb0 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2ecc0 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2ecd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2ece0 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
2ecf0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ed00 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2ed10 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
2ed20 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
2ed30 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
2ed40 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2ed50 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2ed60 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
2ed70 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
2ed80 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
2ed90 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
2eda0 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
2edb0 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
2edc0 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
2edd0 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
2ede0 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2edf0 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
2ee00 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
2ee10 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
2ee20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
2ee30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2ee40 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
2ee50 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
2ee60 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
2ee70 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
2ee80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
2ee90 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
2eea0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
2eeb0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
2eec0 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
2eed0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2eee0 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
2eef0 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
2ef00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2ef10 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
2ef20 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
2ef30 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
2ef40 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
2ef50 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
2ef60 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
2ef70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
2ef80 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
2ef90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2efa0 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
2efb0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2efc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2efd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2efe0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67  rc;.    }.    pg
2eff0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
2f000 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
2f010 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
2f020 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
2f030 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2f040 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
2f050 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
2f060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
2f070 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
2f080 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2f090 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
2f0a0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
2f0b0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2f0c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
2f0d0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
2f0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2f0f0 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
2f100 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
2f110 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
2f120 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
2f130 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
2f140 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2f150 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
2f160 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
2f170 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
2f180 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
2f190 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
2f1a0 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
2f1b0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
2f1c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2f1d0 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
2f1e0 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
2f1f0 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
2f200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f210 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f220 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2f230 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
2f240 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
2f250 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
2f260 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
2f270 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
2f280 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
2f290 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
2f2a0 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
2f2b0 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
2f2c0 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
2f2d0 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
2f2e0 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
2f2f0 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
2f300 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
2f310 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2f320 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
2f330 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
2f340 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
2f350 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
2f360 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
2f370 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
2f380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f390 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2f3a0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
2f3b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2f3c0 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
2f3d0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
2f3e0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
2f3f0 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
2f400 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
2f410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f420 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f430 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2f440 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f460 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f470 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2f480 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2f490 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2f4a0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2f4b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2f4c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2f4d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2f4e0 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2f4f0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2f500 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2f510 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2f520 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2f530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f540 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2f550 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2f560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2f570 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2f580 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2f590 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f5a0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2f5b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2f5c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f5d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2f5e0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2f5f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2f600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f610 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2f620 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2f630 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2f640 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20  gnoMove, 0);.   
2f650 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f660 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
2f670 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
2f680 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
2f690 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f6a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f6b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f6c0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2f6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f6e0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
2f6f0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
2f700 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f720 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f730 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2f740 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f750 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
2f760 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2f770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f780 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2f790 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2f7a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f7b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2f7c0 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
2f7d0 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20  PageMove;.    } 
2f7e0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
2f7f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2f800 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69  and meta-data wi
2f810 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  th the new root-
2f820 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
2f830 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2f840 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ut(pBt, pgnoRoot
2f850 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
2f860 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
2f870 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
2f880 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2f890 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f8a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
2f8b0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2f8c0 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f  eMeta(p, 4, pgno
2f8d0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2f8e0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
2f8f0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2f900 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f910 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
2f920 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2f930 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2f940 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
2f950 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
2f960 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f970 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
2f980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2f990 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2f9a0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
2f9b0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
2f9c0 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
2f9d0 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
2f9e0 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74  PagerUnref(pRoot
2f9f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  ->pDbPage);.  *p
2fa00 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67  iTable = (int)pg
2fa10 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e  noRoot;.  return
2fa20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
2fa30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
2fa40 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2fa50 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2fa60 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2fa70 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2fa80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2fa90 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
2faa0 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
2fab0 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
2fac0 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
2fad0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2fae0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
2faf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2fb00 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
2fb10 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
2fb20 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
2fb30 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
2fb40 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
2fb50 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
2fb60 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
2fb70 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
2fb80 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
2fb90 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
2fba0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2fbb0 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
2fbc0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
2fbd0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2fbe0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
2fbf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2fc00 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e  nt,     /* Paren
2fc10 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f  t page.  NULL fo
2fc20 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20  r the root */.  
2fc30 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
2fc40 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
2fc50 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
2fc60 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2fc70 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
2fc80 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
2fc90 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
2fca0 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
2fcb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2fcc0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2fcd0 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ) );.  if( pgno>
2fce0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2fcf0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
2fd00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fd10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fd20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
2fd30 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2fd40 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20 70 50 61  gno, &pPage, pPa
2fd50 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20  rent);.  if( rc 
2fd60 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2fd70 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2fd80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
2fd90 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2fda0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2fdb0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
2fdc0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2fdd0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2fde0 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2fdf0 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2fe00 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d  e(pCell), pPage-
2fe10 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20  >pParent, 1);.  
2fe20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2fe30 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
2fe40 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2fe50 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
2fe60 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
2fe70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2fe80 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2fe90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2fea0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2feb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65   ){.    rc = cle
2fec0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2fed0 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  Bt, get4byte(&pP
2fee0 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20  age->aData[8]), 
2fef0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20  pPage->pParent, 
2ff00 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  1);.    if( rc )
2ff10 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2ff20 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2ff30 0a 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46  .  if( freePageF
2ff40 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
2ff50 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
2ff60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63  .  }else if( (rc
2ff70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ff80 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2ff90 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  age))==0 ){.    
2ffa0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2ffb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2ffc0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d  | PTF_LEAF);.  }
2ffd0 0a 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  ..cleardatabasep
2ffe0 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  age_out:.  relea
2fff0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30010 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20  *.** Delete all 
30020 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
30030 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
30040 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
30050 20 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74    iTable is.** t
30060 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
30070 66 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  f the root of th
30080 65 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20  e table.  After 
30090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
300a0 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f  urns,.** the roo
300b0 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c  t page is empty,
300c0 20 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74   but still exist
300d0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
300e0 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20  utine will fail 
300f0 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  with SQLITE_LOCK
30100 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ED if there are 
30110 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64  any open.** read
30120 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
30130 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69  table.  Open wri
30140 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d  te cursors are m
30150 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72  oved to the.** r
30160 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
30170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30180 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
30190 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
301a0 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  able){.  int rc;
301b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
301c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
301d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
301e0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
301f0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
30200 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
30210 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
30220 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
30230 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
30240 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
30250 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
30260 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  = checkReadLocks
30270 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31  (p, iTable, 0, 1
30280 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
30290 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
302a0 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
302b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
302c0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
302d0 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
302e0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  , 0)) ){.    /* 
302f0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
30300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
30310 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
30320 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
30330 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20  iTable, 0, 0);. 
30340 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
30350 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
30360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30370 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72   Erase all infor
30380 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c  mation in a tabl
30390 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f  e and add the ro
303a0 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ot of the table 
303b0 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  to.** the freeli
303c0 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65  st.  Except, the
303d0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69   root of the pri
303e0 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68  nciple table (th
303f0 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65  e one on.** page
30400 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64   1) is never add
30410 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
30420 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
30430 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
30440 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
30450 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
30460 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72   any open.** cur
30470 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
30480 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f  e..**.** If AUTO
30490 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65  VACUUM is enable
304a0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61  d and the page a
304b0 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20  t iTable is not 
304c0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74  the last.** root
304d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
304e0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
304f0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
30500 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64  age .** in the d
30510 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
30520 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73  moved into the s
30530 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
30540 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62  upied by.** iTab
30550 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74  le and that last
30560 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
30570 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c  ccupied by the l
30580 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ast root page.**
30590 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
305a0 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61   freelist instea
305b0 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e  d of iTable.  In
305c0 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a   this say, all.*
305d0 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65  * root pages are
305e0 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67   kept at the beg
305f0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
30600 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
30610 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61  ch.** is necessa
30620 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55  ry for AUTOVACUU
30630 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e  M to work right.
30640 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65    *piMoved is se
30650 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67  t to the .** pag
30660 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73  e number that us
30670 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73  ed to be the las
30680 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  t root page in t
30690 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a  he file before.*
306a0 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20  * the move.  If 
306b0 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76  no page gets mov
306c0 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  ed, *piMoved is 
306d0 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65  set to 0..** The
306e0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
306f0 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d  is recorded in m
30700 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76  eta[3] and the v
30710 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b  alue of.** meta[
30720 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79  3] is updated by
30730 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
30740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
30750 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
30760 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
30770 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
30780 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
30790 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
307a0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
307b0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
307c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
307d0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
307e0 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ) );.  if( p->in
307f0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
30800 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
30810 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
30820 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
30830 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
30840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73  .  }..  /* It is
30850 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70   illegal to drop
30860 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
30870 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
30880 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
30890 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
308a0 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
308b0 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
308c0 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
308d0 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f  need to move ano
308e0 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74  ther root-page t
308f0 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66  o fill a gap lef
30900 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
30910 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  .  ** root page.
30920 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   If an open curs
30930 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69  or was using thi
30940 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d  s page a problem
30950 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63   would .  ** occ
30960 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
30970 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
30980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30990 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20  _LOCKED;.  }..  
309a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
309b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
309c0 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61  gno)iTable, &pPa
309d0 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
309e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
309f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30a00 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69  eClearTable(p, i
30a10 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  Table);.  if( rc
30a20 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
30a30 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
30a50 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
30a60 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
30a70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
30a80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30a90 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
30aa0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
30ab0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30ac0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
30ad0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
30ae0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
30af0 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
30b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30b10 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
30b20 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
30b30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30b50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30b60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
30b70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30b80 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
30b90 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
30ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30bb0 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
30bc0 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
30bd0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
30be0 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
30bf0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
30c00 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
30c10 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
30c20 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
30c30 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
30c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
30c50 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
30c60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
30c70 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
30c80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30ca0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30cd0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
30ce0 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
30cf0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
30d00 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
30d10 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
30d20 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30d30 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
30d40 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
30d50 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
30d60 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
30d70 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
30d80 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
30d90 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
30da0 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
30db0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30dc0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
30dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
30de0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
30df0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
30e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30e10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30e20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30e30 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30e40 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
30e50 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
30e60 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
30e70 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c  PAGE, 0, iTable,
30e80 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c   0);.        rel
30e90 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b  easePage(pMove);
30ea0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30eb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
30ed0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
30ee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30ef0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
30f00 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20  t, maxRootPgno, 
30f10 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20  &pMove, 0);.    
30f20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30f40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30f60 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d  rc = freePage(pM
30f70 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ove);.        re
30f80 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29  leasePage(pMove)
30f90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30fb0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30fc0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30fd0 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d        *piMoved =
30fe0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
30ff0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
31000 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78  Set the new 'max
31010 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75  -root-page' valu
31020 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
31030 65 20 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20  e header. This. 
31040 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f       ** is the o
31050 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e  ld value less on
31060 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65  e, less one more
31070 20 69 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   if that happens
31080 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20   to.      ** be 
31090 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  a root-page numb
310a0 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61  er, less one aga
310b0 69 6e 20 69 66 20 74 68 61 74 20 69 73 20 74 68  in if that is th
310c0 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49  e.      ** PENDI
310d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20  NG_BYTE_PAGE..  
310e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78      */.      max
310f0 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  RootPgno--;.    
31100 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
31110 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
31120 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
31130 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
31140 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
31150 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e    if( maxRootPgn
31160 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  o==PTRMAP_PAGENO
31170 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e  (pBt, maxRootPgn
31180 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  o) ){.        ma
31190 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20  xRootPgno--;.   
311a0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
311b0 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d  t( maxRootPgno!=
311c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
311d0 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20  E(pBt) );..     
311e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
311f0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
31200 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b  4, maxRootPgno);
31210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31220 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
31230 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
31240 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
31250 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
31260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
31270 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72  f sqlite3BtreeDr
31280 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c  opTable was call
31290 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ed on page 1. */
312a0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
312b0 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  age, PTF_INTKEY|
312c0 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20  PTF_LEAF );.    
312d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
312e0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
312f0 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
31300 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
31310 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
31320 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
31330 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
31340 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
31350 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
31360 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
31370 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70    rc = btreeDrop
31380 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
31390 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c   piMoved);.  sql
313a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
313b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
313c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
313d0 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
313e0 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
313f0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
31400 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
31410 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
31420 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
31430 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
31440 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
31450 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
31460 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
31470 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
31480 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
31490 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
314a0 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
314b0 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
314c0 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
314d0 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
314e0 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
314f0 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
31500 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
31510 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
31520 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
31530 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
31540 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
31550 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
31560 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
31570 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
31580 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
31590 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
315a0 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
315b0 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
315c0 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
315d0 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  age;.  int rc;. 
315e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
315f0 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pP1;.  BtShared 
31600 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
31610 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
31620 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
31630 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
31640 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61 2d   Reading a meta-
31650 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75 69  data value requi
31660 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
31670 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20 68  on page 1 (and h
31680 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73 71  ence.  ** the sq
31690 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
316a0 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73 20  e. We grab this 
316b0 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73 20  lock regardless 
316c0 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20 20  of whether or.  
316d0 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49 54  ** not the SQLIT
316e0 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
316f0 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28 74  d flag is set (t
31700 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
31710 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20 69  at page.  ** 1 i
31720 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20 73  s treated as a s
31730 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20 71  pecial case by q
31740 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ueryTableLock() 
31750 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  and lockTable())
31760 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
31770 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  eryTableLock(p, 
31780 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  1, READ_LOCK);. 
31790 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
317a0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
317b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
317c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
317d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64   }..  assert( id
317e0 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20  x>=0 && idx<=15 
317f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
31800 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
31810 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62 50 61  Pager, 1, &pDbPa
31820 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ge);.  if( rc ){
31830 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
31840 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
31850 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
31860 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  pP1 = (unsigned 
31870 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
31880 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
31890 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20  ge);.  *pMeta = 
318a0 67 65 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  get4byte(&pP1[36
318b0 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71   + idx*4]);.  sq
318c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
318d0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
318e0 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  If autovacuumed 
318f0 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
31900 68 69 73 20 62 75 69 6c 64 20 62 75 74 20 77 65  his build but we
31910 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 0a   are trying to .
31920 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e 20 61    ** access an a
31930 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61  utovacuumed data
31940 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  base, then make 
31950 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 61  the database rea
31960 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66  donly. .  */.#if
31970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31980 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
31990 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74   idx==4 && *pMet
319a0 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61 64 4f  a>0 ) pBt->readO
319b0 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  nly = 1;.#endif.
319c0 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 72  .  /* Grab the r
319d0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65  ead-lock on page
319e0 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f   1. */.  rc = lo
319f0 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20 52 45  ckTable(p, 1, RE
31a00 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69  AD_LOCK);.  sqli
31a10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
31a20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
31a30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
31a40 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
31a50 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
31a60 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
31a70 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
31a80 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
31a90 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
31aa0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
31ab0 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
31ac0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
31ad0 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
31ae0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
31af0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31b00 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
31b10 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
31b20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
31b30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
31b40 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
31b50 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
31b60 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
31b70 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
31b80 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
31b90 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
31ba0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
31bb0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
31bc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
31bd0 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  ge1!=0 );.    pP
31be0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
31bf0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
31c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31c10 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
31c20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31c40 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
31c50 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
31c60 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e  4], iMeta);.#ifn
31c70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31c80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31c90 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20   if( idx==7 ){. 
31ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
31cb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c  Bt->autoVacuum |
31cc0 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20  | iMeta==0 );.  
31cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4d        assert( iM
31ce0 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d  eta==0 || iMeta=
31cf0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42  =1 );.        pB
31d00 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
31d10 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23  iMeta;.      }.#
31d20 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
31d30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
31d40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
31d50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
31d60 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
31d70 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
31d80 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
31d90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
31da0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
31db0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
31dc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
31dd0 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
31de0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
31df0 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52  : What about CUR
31e00 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
31e10 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20  state? Probably 
31e20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  need to call.  *
31e30 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  * restoreCursorP
31e40 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a  osition() here..
31e50 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a    */.  MemPage *
31e60 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65  pPage;.  restore
31e70 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
31e80 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Cur);.  pPage = 
31e90 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
31ea0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
31eb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
31ec0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31ed0 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74  ->pBt==pCur->pBt
31ee0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
31ef0 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74  ge ? pPage->aDat
31f00 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
31f10 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  et] : 0;.}.../*.
31f20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
31f30 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
31f40 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
31f50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
31f60 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
31f70 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
31f80 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
31f90 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
31fa0 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
31fb0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
31fc0 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
31fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
31fe0 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
31ff0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
32000 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
32010 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
32020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32030 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
32040 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
32050 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
32060 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
32070 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
32080 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
32090 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  ap;.  if( !pChec
320a0 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
320b0 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
320c0 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
320d0 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
320e0 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
320f0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
32100 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20  rrMsg.nChar ){. 
32110 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
32120 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
32130 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20  ->errMsg, "\n", 
32140 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  1);.  }.  if( zM
32150 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sg1 ){.    sqlit
32160 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
32170 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
32180 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20  , zMsg1, -1);.  
32190 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69  }.  sqlite3VXPri
321a0 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  ntf(&pCheck->err
321b0 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c  Msg, 1, zFormat,
321c0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
321d0 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  p);.  if( pCheck
321e0 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46  ->errMsg.mallocF
321f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68  ailed ){.    pCh
32200 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
32210 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d = 1;.  }.}.#en
32220 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
32230 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
32240 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
32250 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
32260 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
32270 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
32280 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
32290 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
322a0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
322b0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
322c0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
322d0 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
322e0 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
322f0 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
32300 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
32310 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
32320 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
32330 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
32340 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
32350 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
32360 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
32370 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
32380 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
32390 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
323a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
323b0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
323c0 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69  k *pCheck, int i
323d0 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e  Page, char *zCon
323e0 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61  text){.  if( iPa
323f0 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ge==0 ) return 1
32400 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43  ;.  if( iPage>pC
32410 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69  heck->nPage || i
32420 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68  Page<0 ){.    ch
32430 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32440 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
32450 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d  invalid page num
32460 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b  ber %d", iPage);
32470 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
32480 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d   }.  if( pCheck-
32490 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31  >anRef[iPage]==1
324a0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
324b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
324c0 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65  Context, "2nd re
324d0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
324e0 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
324f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
32500 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b   return  (pCheck
32510 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b  ->anRef[iPage]++
32520 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  )>1;.}..#ifndef 
32530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32540 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65  VACUUM./*.** Che
32550 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ck that the entr
32560 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
32570 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43  -map for page iC
32580 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a  hild maps to .**
32590 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70   page iParent, p
325a0 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54  ointer type ptrT
325b0 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70  ype. If not, app
325c0 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  end an error mes
325d0 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63  sage.** to pChec
325e0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
325f0 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20  d checkPtrmap(. 
32600 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
32610 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67  heck,   /* Integ
32620 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65  rity check conte
32630 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  xt */.  Pgno iCh
32640 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ild,           /
32650 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d  * Child page num
32660 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ber */.  u8 eTyp
32670 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
32680 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
32690 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a  ter map type */.
326a0 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20    Pgno iParent, 
326b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
326c0 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70  cted pointer map
326d0 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
326e0 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
326f0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
32700 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72  /* Context descr
32710 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72  iption (used for
32720 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29   error msg) */.)
32730 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38  {.  int rc;.  u8
32740 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20   ePtrmapType;.  
32750 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65  Pgno iPtrmapPare
32760 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d  nt;..  rc = ptrm
32770 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42  apGet(pCheck->pB
32780 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72  t, iChild, &ePtr
32790 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61  mapType, &iPtrma
327a0 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
327b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
327c0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
327d0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
327e0 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f  text, "Failed to
327f0 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79   read ptrmap key
32800 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20  =%d", iChild);. 
32810 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
32820 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70    if( ePtrmapTyp
32830 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72  e!=eType || iPtr
32840 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65  mapParent!=iPare
32850 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  nt ){.    checkA
32860 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32870 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
32880 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65    "Bad ptr map e
32890 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65  ntry key=%d expe
328a0 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74  cted=(%d,%d) got
328b0 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20  =(%d,%d)", .    
328c0 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c    iChild, eType,
328d0 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61   iParent, ePtrma
328e0 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61  pType, iPtrmapPa
328f0 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  rent);.  }.}.#en
32900 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
32910 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
32920 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f  f the freelist o
32930 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
32940 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56   page list..** V
32950 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
32960 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
32970 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e  n the list is N.
32980 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32990 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74  checkList(.  Int
329a0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
329b0 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20  ,  /* Integrity 
329c0 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74  checking context
329d0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65   */.  int isFree
329e0 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  List,       /* T
329f0 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69  rue for a freeli
32a00 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f  st.  False for o
32a10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
32a20 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  t */.  int iPage
32a30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32a40 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Page number for 
32a50 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68  first page in th
32a60 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e list */.  int 
32a70 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
32a80 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75    /* Expected nu
32a90 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
32aa0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63   the list */.  c
32ab0 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
32ac0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
32ad0 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
32ae0 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
32af0 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64  ;.  int expected
32b00 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72   = N;.  int iFir
32b10 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68  st = iPage;.  wh
32b20 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20  ile( N-- > 0 && 
32b30 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b  pCheck->mxErr ){
32b40 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76  .    DbPage *pOv
32b50 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69  flPage;.    unsi
32b60 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c  gned char *pOvfl
32b70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50  Data;.    if( iP
32b80 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63  age<1 ){.      c
32b90 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32ba0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
32bb0 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20           "%d of 
32bc0 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67  %d pages missing
32bd0 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c   from overflow l
32be0 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20  ist starting at 
32bf0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  %d",.          N
32c00 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46  +1, expected, iF
32c10 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  irst);.      bre
32c20 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
32c30 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
32c40 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65  k, iPage, zConte
32c50 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  xt) ) break;.   
32c60 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
32c70 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61  rGet(pCheck->pPa
32c80 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65  ger, (Pgno)iPage
32c90 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b  , &pOvflPage) ){
32ca0 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
32cb0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
32cc0 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20  ontext, "failed 
32cd0 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c  to get page %d",
32ce0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62   iPage);.      b
32cf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32d00 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73  pOvflData = (uns
32d10 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
32d20 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
32d30 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20  (pOvflPage);.   
32d40 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20   if( isFreeList 
32d50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  ){.      int n =
32d60 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
32d70 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65  Data[4]);.#ifnde
32d80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32d90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
32da0 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
32db0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
32dc0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32dd0 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  p(pCheck, iPage,
32de0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
32df0 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
32e00 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
32e10 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63       if( n>pChec
32e20 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  k->pBt->usableSi
32e30 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20  ze/4-2 ){.      
32e40 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32e50 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32e60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66  t,.           "f
32e70 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75  reelist leaf cou
32e80 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61  nt too big on pa
32e90 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
32ea0 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20          N--;.   
32eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
32ed0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32ee0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d  Pgno iFreePage =
32ef0 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c   get4byte(&pOvfl
32f00 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69  Data[8+i*4]);.#i
32f10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32f20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32f30 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63         if( pChec
32f40 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
32f50 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
32f60 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
32f70 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
32f80 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
32f90 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  , 0, zContext);.
32fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64            }.#end
32fb0 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65  if.          che
32fc0 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46  ckRef(pCheck, iF
32fd0 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  reePage, zContex
32fe0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
32ff0 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20        N -= n;.  
33000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
33010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33020 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65  AUTOVACUUM.    e
33030 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  lse{.      /* If
33040 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
33050 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
33060 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73  uum and iPage is
33070 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20   not the last.  
33080 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
33090 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  his overflow lis
330a0 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  t, check that th
330b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
330c0 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  try for.      **
330d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   the following p
330e0 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67  age matches iPag
330f0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
33100 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
33110 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33120 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   N>0 ){.        
33130 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  i = get4byte(pOv
33140 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  flData);.       
33150 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
33160 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f  eck, i, PTRMAP_O
33170 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c  VERFLOW2, iPage,
33180 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
33190 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
331a0 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74  .    iPage = get
331b0 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29  4byte(pOvflData)
331c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
331d0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67  erUnref(pOvflPag
331e0 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
331f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
33200 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
33210 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
33220 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
33230 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f  Y_CHECK./*.** Do
33240 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20   various sanity 
33250 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67  checks on a sing
33260 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65  le page of a tre
33270 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
33280 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52  e tree depth.  R
33290 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e  oot pages return
332a0 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20   0.  Parents of 
332b0 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65  root pages.** re
332c0 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66  turn 1, and so f
332d0 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  orth..** .** The
332e0 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f  se checks are do
332f0 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31  ne:.**.**      1
33300 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
33310 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65  t cells and free
33320 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76  blocks do not ov
33330 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20  erlap.**        
33340 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f    but combine to
33350 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65   completely cove
33360 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20  r the page..**  
33370 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72  NO  2.  Make sur
33380 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20  e cell keys are 
33390 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f  in order..**  NO
333a0 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20    3.  Make sure 
333b0 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74  no key is less t
333c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
333d0 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20  zLowerBound..** 
333e0 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75   NO  4.  Make su
333f0 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65  re no key is gre
33400 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
33410 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e  al to zUpperBoun
33420 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43  d..**      5.  C
33430 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
33440 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  ty of overflow p
33450 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e  ages..**      6.
33460 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61    Recursively ca
33470 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  ll checkTreePage
33480 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   on all children
33490 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65  ..**      7.  Ve
334a0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65  rify that the de
334b0 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64  pth of all child
334c0 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e  ren is the same.
334d0 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b  .**      8.  Mak
334e0 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65  e sure this page
334f0 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25   is at least 33%
33500 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74   full or else it
33510 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   is.**          
33520 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
33530 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
33540 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67  int checkTreePag
33550 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  e(.  IntegrityCk
33560 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f   *pCheck,  /* Co
33570 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61  ntext for the sa
33580 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20  nity check */.  
33590 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20  int iPage,      
335a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
335b0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
335c0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d   to check */.  M
335d0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
335e0 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
335f0 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  age */.  char *z
33600 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f  ParentContext  /
33610 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74  * Parent context
33620 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
33630 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69   *pPage;.  int i
33640 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c  , rc, depth, d2,
33650 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e   pgno, cnt;.  in
33660 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74  t hdr, cellStart
33670 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20  ;.  int nCell;. 
33680 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53   u8 *data;.  BtS
33690 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e  hared *pBt;.  in
336a0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
336b0 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30  char zContext[10
336c0 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b  0];.  char *hit;
336d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
336e0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e  intf(sizeof(zCon
336f0 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c  text), zContext,
33700 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50   "Page %d: ", iP
33710 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  age);..  /* Chec
33720 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
33730 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42  exists.  */.  pB
33740 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b  t = pCheck->pBt;
33750 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
33760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
33770 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20  .  if( iPage==0 
33780 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
33790 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63  ( checkRef(pChec
337a0 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e  k, iPage, zParen
337b0 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75  tContext) ) retu
337c0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20  rn 0;.  if( (rc 
337d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
337e0 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
337f0 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20  )iPage, &pPage, 
33800 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  0))!=0 ){.    ch
33810 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33820 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
33830 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
33840 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
33850 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
33860 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
33870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  ;.  }.  if( (rc 
33880 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
33890 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50  itPage(pPage, pP
338a0 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20  arent))!=0 ){.  
338b0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
338c0 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
338d0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
338e0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42         "sqlite3B
338f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72  treeInitPage() r
33900 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64  eturns error cod
33910 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e %d", rc);.    
33920 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
33930 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
33940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
33950 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65  k out all the ce
33960 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74  lls..  */.  dept
33970 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  h = 0;.  for(i=0
33980 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
33990 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72   && pCheck->mxEr
339a0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  r; i++){.    u8 
339b0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20  *pCell;.    int 
339c0 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  sz;.    CellInfo
339d0 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43   info;..    /* C
339e0 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65  heck payload ove
339f0 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
33a00 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
33a10 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
33a20 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65  Context), zConte
33a30 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
33a40 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25   "On tree page %
33a50 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50  d cell %d: ", iP
33a60 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65  age, i);.    pCe
33a70 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
33a80 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69  age,i);.    sqli
33a90 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
33aa0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
33ab0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73  l, &info);.    s
33ac0 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  z = info.nData;.
33ad0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
33ae0 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69  intKey ) sz += i
33af0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73  nfo.nKey;.    as
33b00 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e  sert( sz==info.n
33b10 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69  Payload );.    i
33b20 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  f( sz>info.nLoca
33b30 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  l ){.      int n
33b40 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66  Page = (sz - inf
33b50 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c  o.nLocal + usabl
33b60 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62  eSize - 5)/(usab
33b70 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
33b80 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c     Pgno pgnoOvfl
33b90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
33ba0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
33bb0 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  w]);.#ifndef SQL
33bc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33bd0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
33be0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
33bf0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
33c00 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
33c10 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
33c20 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20  ERFLOW1, iPage, 
33c30 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33c40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
33c50 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b  checkList(pCheck
33c60 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e  , 0, pgnoOvfl, n
33c70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  Page, zContext);
33c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
33c90 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c  heck sanity of l
33ca0 65 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  eft child page..
33cb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
33cc0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33cd0 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
33ce0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66  byte(pCell);.#if
33cf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33d00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33d10 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
33d20 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
33d30 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
33d40 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41  eck, pgno, PTRMA
33d50 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20  P_BTREE, iPage, 
33d60 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33d70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
33d80 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61  d2 = checkTreePa
33d90 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70  ge(pCheck,pgno,p
33da0 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a  Page,zContext);.
33db0 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
33dc0 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20   d2!=depth ){.  
33dd0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33de0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
33df0 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61  ntext, "Child pa
33e00 67 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73  ge depth differs
33e10 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
33e20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20    depth = d2;.  
33e30 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70    }.  }.  if( !p
33e40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
33e50 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
33e60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
33e70 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
33e80 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  +8]);.    sqlite
33e90 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
33ea0 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f  f(zContext), zCo
33eb0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
33ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
33ed0 20 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68   page %d at righ
33ee0 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67  t child: ", iPag
33ef0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
33f00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33f10 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
33f20 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
33f30 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
33f40 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54  pCheck, pgno, PT
33f50 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67  RMAP_BTREE, iPag
33f60 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
33f70 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65  dif.    checkTre
33f80 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67  ePage(pCheck, pg
33f90 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74  no, pPage, zCont
33fa0 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a  ext);.  }. .  /*
33fb0 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c   Check for compl
33fc0 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20  ete coverage of 
33fd0 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  the page.  */.  
33fe0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
33ff0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
34000 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
34010 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61   hit = sqlite3Pa
34020 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
34030 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  ageSize );.  if(
34040 20 68 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70   hit==0 ){.    p
34050 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69  Check->mallocFai
34060 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  led = 1;.  }else
34070 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69 74  {.    memset(hit
34080 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  , 0, usableSize 
34090 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68 69  );.    memset(hi
340a0 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65 28 26  t, 1, get2byte(&
340b0 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b 0a 20  data[hdr+5]));. 
340c0 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62     nCell = get2b
340d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
340e0 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61 72 74  );.    cellStart
340f0 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
34100 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
34110 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34120 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
34130 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
34140 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61 72 74  (&data[cellStart
34150 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 75 31  +i*2]);.      u1
34160 36 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  6 size = cellSiz
34170 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74  ePtr(pPage, &dat
34180 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 69 6e  a[pc]);.      in
34190 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 28  t j;.      if( (
341a0 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  pc+size-1)>=usab
341b0 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20 29  leSize || pc<0 )
341c0 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
341d0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
341e0 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
341f0 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
34200 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
34210 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
34220 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
34230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
34240 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20 6a  r(j=pc+size-1; j
34250 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  >=pc; j--) hit[j
34260 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
34270 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d 30   }.    for(cnt=0
34280 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64 61  , i=get2byte(&da
34290 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30 20  ta[hdr+1]); i>0 
342a0 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 20  && i<usableSize 
342b0 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a 20  && cnt<10000; . 
342c0 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 29            cnt++)
342d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
342e0 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
342f0 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  a[i+2]);.      i
34300 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  nt j;.      if( 
34310 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61 62  (i+size-1)>=usab
34320 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29 7b  leSize || i<0 ){
34330 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
34340 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
34350 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  0,  .           
34360 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65 74   "Corruption det
34370 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25 64  ected in cell %d
34380 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c 69   on page %d",i,i
34390 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20 7d  Page,0);.      }
343a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
343b0 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a 3e  r(j=i+size-1; j>
343c0 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d 2b  =i; j--) hit[j]+
343d0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
343e0 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   i = get2byte(&d
343f0 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ata[i]);.    }. 
34400 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b 20     for(i=cnt=0; 
34410 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69 2b  i<usableSize; i+
34420 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 69  +){.      if( hi
34430 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]==0 ){.     
34440 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
34450 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69 5d  }else if( hit[i]
34460 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  >1 ){.        ch
34470 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
34480 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  eck, 0,.        
34490 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65 73    "Multiple uses
344a0 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66 20   for byte %d of 
344b0 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50 61  page %d", i, iPa
344c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
344d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
344e0 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d 64  }.    if( cnt!=d
344f0 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20 20  ata[hdr+7] ){.  
34500 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
34510 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20  sg(pCheck, 0, . 
34520 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d 65           "Fragme
34530 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25 64  nted space is %d
34540 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20 61   byte reported a
34550 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  s %d on page %d"
34560 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2c  ,.          cnt,
34570 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69 50   data[hdr+7], iP
34580 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
34590 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
345a0 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61  e(hit);..  relea
345b0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
345c0 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b   return depth+1;
345d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
345e0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
345f0 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
34600 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34610 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
34620 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
34630 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c  ine does a compl
34640 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ete check of the
34650 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c   given BTree fil
34660 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a  e.  aRoot[] is.*
34670 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61  * an array of pa
34680 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65  ges numbers were
34690 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65   each page numbe
346a0 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  r is the root pa
346b0 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65  ge of.** a table
346c0 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20  .  nRoot is the 
346d0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
346e0 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a  s in aRoot..**.*
346f0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
34700 65 72 20 6f 66 20 65 72 72 6f 72 20 73 65 65 6e  er of error seen
34710 20 69 6e 20 2a 70 6e 45 72 72 2e 20 20 45 78 63   in *pnErr.  Exc
34720 65 70 74 20 66 6f 72 20 73 6f 6d 65 20 6d 65 6d  ept for some mem
34730 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  ory.** allocatio
34740 6e 20 65 72 72 6f 72 73 2c 20 20 6e 6e 20 65 72  n errors,  nn er
34750 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 68  ror message is h
34760 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  eld in memory ob
34770 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d  tained from.** m
34780 61 6c 6c 6f 63 20 69 73 20 72 65 74 75 72 6e 65  alloc is returne
34790 64 20 69 66 20 2a 70 6e 45 72 72 20 69 73 20 6e  d if *pnErr is n
347a0 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70 6e  on-zero.  If *pn
347b0 45 72 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c 4c  Err==0 then NULL
347c0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
347d0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
347e0 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
347f0 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
34800 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
34810 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
34820 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
34830 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
34840 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
34850 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
34860 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
34870 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
34880 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
34890 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
348a0 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
348b0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
348c0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
348d0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
348e0 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
348f0 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
34900 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
34910 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
34920 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
34930 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
34940 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
34950 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34960 70 2d 3e 70 42 74 3b 0a 20 20 63 68 61 72 20 7a  p->pBt;.  char z
34970 45 72 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  Err[100];..  sql
34980 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34990 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
349a0 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73  ->db;.  nRef = s
349b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
349c0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
349d0 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
349e0 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53  eWithRetry(p)!=S
349f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34a00 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20  *pnErr = 1;.    
34a10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34a20 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
34a30 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
34a40 28 30 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71 75  (0, "cannot acqu
34a50 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  ire a read lock 
34a60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 22  on the database"
34a70 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  );.  }.  sCheck.
34a80 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68  pBt = pBt;.  sCh
34a90 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74  eck.pPager = pBt
34aa0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65  ->pPager;.  sChe
34ab0 63 6b 2e 6e 50 61 67 65 20 3d 20 70 61 67 65 72  ck.nPage = pager
34ac0 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b  Pagecount(sCheck
34ad0 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65  .pPager);.  sChe
34ae0 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72  ck.mxErr = mxErr
34af0 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20  ;.  sCheck.nErr 
34b00 3d 20 30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 61  = 0;.  sCheck.ma
34b10 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
34b20 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69    *pnErr = 0;.#i
34b30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34b40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
34b50 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d  f( pBt->nTrunc!=
34b60 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e  0 ){.    sCheck.
34b70 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72  nPage = pBt->nTr
34b80 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  unc;.  }.#endif.
34b90 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61    if( sCheck.nPa
34ba0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c  ge==0 ){.    unl
34bb0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
34bc0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
34bd0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34be0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
34bf0 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65   }.  sCheck.anRe
34c00 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  f = sqlite3Mallo
34c10 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65  c( (sCheck.nPage
34c20 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
34c30 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20  k.anRef[0]) );. 
34c40 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52   if( !sCheck.anR
34c50 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  ef ){.    unlock
34c60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
34c70 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d  t);.    *pnErr =
34c80 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   1;.    sqlite3B
34c90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
34ca0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73 43    for(i=0; i<=sC
34cc0 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b 29  heck.nPage; i++)
34cd0 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  { sCheck.anRef[i
34ce0 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20 50  ] = 0; }.  i = P
34cf0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34d00 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c 3d  (pBt);.  if( i<=
34d10 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b 0a  sCheck.nPage ){.
34d20 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66      sCheck.anRef
34d30 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  [i] = 1;.  }.  s
34d40 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
34d50 69 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73  it(&sCheck.errMs
34d60 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66 28  g, zErr, sizeof(
34d70 7a 45 72 72 29 2c 20 32 30 30 30 30 29 3b 0a 0a  zErr), 20000);..
34d80 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 69    /* Check the i
34d90 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
34da0 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20  freelist.  */.  
34db0 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65 63  checkList(&sChec
34dc0 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28 26  k, 1, get4byte(&
34dd0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
34de0 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20 20  ta[32]),.       
34df0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
34e00 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
34e10 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72  a[36]), "Main fr
34e20 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f  eelist: ");..  /
34e30 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65 20  * Check all the 
34e40 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
34e50 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20  or(i=0; i<nRoot 
34e60 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
34e70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
34e80 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  Root[i]==0 ) con
34e90 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20 53  tinue;.#ifndef S
34ea0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
34eb0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
34ec0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
34ed0 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20   aRoot[i]>1 ){. 
34ee0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
34ef0 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
34f00 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50  i], PTRMAP_ROOTP
34f10 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  AGE, 0, 0);.    
34f20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68 65  }.#endif.    che
34f30 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68 65  ckTreePage(&sChe
34f40 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c  ck, aRoot[i], 0,
34f50 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20 72   "List of tree r
34f60 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20  oots: ");.  }.. 
34f70 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
34f80 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
34f90 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e 63  file is referenc
34fa0 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ed.  */.  for(i=
34fb0 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  1; i<=sCheck.nPa
34fc0 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45  ge && sCheck.mxE
34fd0 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66  rr; i++){.#ifdef
34fe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34ff0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
35000 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
35010 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  =0 ){.      chec
35020 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
35030 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
35040 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
35050 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  i);.    }.#else.
35060 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
35070 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
35080 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b  auto-vacuum, mak
35090 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65 73  e sure no tables
350a0 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
350b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f  references to po
350c0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
350d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
350e0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d  sCheck.anRef[i]=
350f0 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28 50  =0 && .       (P
35100 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
35110 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d  , i)!=i || !pBt-
35120 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a  >autoVacuum) ){.
35130 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
35140 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
35150 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
35160 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
35170 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68 65    }.    if( sChe
35180 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26  ck.anRef[i]!=0 &
35190 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
351a0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
351b0 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74 6f  ==i && pBt->auto
351c0 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20  Vacuum) ){.     
351d0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
351e0 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69  &sCheck, 0, "Poi
351f0 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25 64  nter map page %d
35200 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22 2c   is referenced",
35210 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   i);.    }.#endi
35220 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  f.  }..  /* Make
35230 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c 79   sure this analy
35240 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61 76  sis did not leav
35250 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70 61  e any unref() pa
35260 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63  ges.  */.  unloc
35270 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
35280 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66 20  Bt);.  if( nRef 
35290 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  != sqlite3PagerR
352a0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
352b0 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65 63  ger) ){.    chec
352c0 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
352d0 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22 4f  ck, 0, .      "O
352e0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
352f0 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20  count goes from 
35300 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67 20  %d to %d during 
35310 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a  this analysis",.
35320 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c 69        nRef, sqli
35330 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
35340 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20 20  (pBt->pPager).  
35350 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43    );.  }..  /* C
35360 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65 70  lean  up and rep
35370 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  ort errors..  */
35380 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35390 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  eave(p);.  sqlit
353a0 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e 61  e3_free(sCheck.a
353b0 6e 52 65 66 29 3b 0a 20 20 69 66 28 20 73 43 68  nRef);.  if( sCh
353c0 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  eck.mallocFailed
353d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
353e0 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 73 43  trAccumReset(&sC
353f0 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20 20  heck.errMsg);.  
35400 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63    *pnErr = sChec
35410 6b 2e 6e 45 72 72 2b 31 3b 0a 20 20 20 20 72 65  k.nErr+1;.    re
35420 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  turn 0;.  }.  *p
35430 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45  nErr = sCheck.nE
35440 72 72 3b 0a 20 20 69 66 28 20 73 43 68 65 63 6b  rr;.  if( sCheck
35450 2e 6e 45 72 72 3d 3d 30 20 29 20 73 71 6c 69 74  .nErr==0 ) sqlit
35460 65 33 53 74 72 41 63 63 75 6d 52 65 73 65 74 28  e3StrAccumReset(
35470 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b  &sCheck.errMsg);
35480 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
35490 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28  3StrAccumFinish(
354a0 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b  &sCheck.errMsg);
354b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
354c0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
354d0 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a  TY_CHECK */../*.
354e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
354f0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
35500 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
35510 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
35520 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66 69 6c  ** The pager fil
35530 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
35540 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
35550 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
35560 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
35570 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
35580 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
35590 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
355a0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
355b0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74  eeGetFilename(Bt
355c0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
355d0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
355e0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
355f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
35600 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  ename(p->pBt->pP
35610 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
35620 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
35630 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
35640 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
35650 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
35660 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
35670 70 61 67 65 72 20 64 69 72 65 63 74 6f 72 79 20  pager directory 
35680 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
35690 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
356a0 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
356b0 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
356c0 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
356d0 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
356e0 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
356f0 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
35700 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65  eGetDirname(Btre
35710 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
35720 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
35730 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
35740 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
35750 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
35760 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
35770 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
35780 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
35790 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61  file for this da
357a0 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75  tabase. The retu
357b0 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  rn.** value of t
357c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
357d0 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65  he same regardle
357e0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
357f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
35800 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
35810 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  ed or not..**.**
35820 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e   The pager journ
35830 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
35840 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
35850 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
35860 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
35870 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
35880 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
35890 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
358a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
358b0 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
358c0 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  alname(Btree *p)
358d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
358e0 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
358f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
35900 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
35910 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
35920 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
35930 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
35940 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
35950 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
35960 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f   of pBtFrom into
35970 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73   pBtTo.  A trans
35980 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62  action.** must b
35990 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74  e active for bot
359a0 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  h files..**.** T
359b0 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20  he size of file 
359c0 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63  pTo may be reduc
359d0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
359e0 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74  tion..** If anyt
359f0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
35a00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
35a10 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65   on pTo is rolle
35a20 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  d back. .**.** I
35a30 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f  f successful, Co
35a40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d  mmitPhaseOne() m
35a50 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
35a60 70 54 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72  pTo before retur
35a70 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61  ning. .** The ca
35a80 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69  ller should fini
35a90 73 68 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68  sh committing th
35aa0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e transaction on
35ab0 20 70 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a   pTo by calling.
35ac0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
35ad0 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  ommit()..*/.stat
35ae0 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79  ic int btreeCopy
35af0 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c  File(Btree *pTo,
35b00 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a   Btree *pFrom){.
35b10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35b20 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a  E_OK;.  Pgno i;.
35b30 0a 20 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67  .  Pgno nFromPag
35b40 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  e;     /* Number
35b50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 46 72   of pages in pFr
35b60 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f  om */.  Pgno nTo
35b70 50 61 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Page;       /* N
35b80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
35b90 6e 20 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20  n pTo */.  Pgno 
35ba0 6e 4e 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f  nNewPage;      /
35bb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
35bc0 73 20 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74  s in pTo after t
35bd0 68 65 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67  he copy */..  Pg
35be0 6e 6f 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20  no iSkip;       
35bf0 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74    /* Pending byt
35c00 65 20 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f  e page in pTo */
35c10 0a 20 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69  .  int nToPageSi
35c20 7a 65 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73  ze;    /* Page s
35c30 69 7a 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79  ize of pTo in by
35c40 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  tes */.  int nFr
35c50 6f 6d 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  omPageSize;  /* 
35c60 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72  Page size of pFr
35c70 6f 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  om in bytes */..
35c80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 54    BtShared *pBtT
35c90 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20  o = pTo->pBt;.  
35ca0 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f  BtShared *pBtFro
35cb0 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  m = pFrom->pBt;.
35cc0 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54    pBtTo->db = pT
35cd0 6f 2d 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d  o->db;.  pBtFrom
35ce0 2d 3e 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62  ->db = pFrom->db
35cf0 3b 0a 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65  ;..  nToPageSize
35d00 20 3d 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69   = pBtTo->pageSi
35d10 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53  ze;.  nFromPageS
35d20 69 7a 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70  ize = pBtFrom->p
35d30 61 67 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20  ageSize;..  if( 
35d40 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  pTo->inTrans!=TR
35d50 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72  ANS_WRITE || pFr
35d60 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  om->inTrans!=TRA
35d70 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
35d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
35d90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
35da0 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b  BtTo->pCursor ){
35db0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35dc0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
35dd0 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65 72 50  nToPage = pagerP
35de0 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
35df0 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d  pPager);.  nFrom
35e00 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
35e10 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70  count(pBtFrom->p
35e20 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20  Pager);.  iSkip 
35e30 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
35e40 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f  AGE(pBtTo);..  /
35e50 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65 77 50  * Variable nNewP
35e60 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  age is the numbe
35e70 72 20 6f 66 20 70 61 67 65 73 20 72 65 71 75 69  r of pages requi
35e80 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
35e90 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  .  ** contents o
35ea0 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20 74 68  f pFrom using th
35eb0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2d 73  e current page-s
35ec0 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f  ize of pTo..  */
35ed0 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20 28 28  .  nNewPage = ((
35ee0 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20  i64)nFromPage * 
35ef0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69  (i64)nFromPageSi
35f00 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50 61 67  ze + (i64)nToPag
35f10 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20  eSize - 1) / .  
35f20 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61 67 65      (i64)nToPage
35f30 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  Size;..  for(i=1
35f40 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
35f50 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c  && (i<=nToPage |
35f60 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20  | i<=nNewPage); 
35f70 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f  i++){..    /* Jo
35f80 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e  urnal the origin
35f90 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  al page..    **.
35fa0 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20      ** iSkip is 
35fb0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
35fc0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  of the locking p
35fd0 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  age (PENDING_BYT
35fe0 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69  E_PAGE).    ** i
35ff0 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20  n database *pTo 
36000 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79  (before the copy
36010 29 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20  ). This page is 
36020 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20  never written . 
36030 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a     ** into the j
36040 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c  ournal file. Unl
36050 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20  ess i==iSkip or 
36060 74 68 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74  the page was not
36070 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  .    ** present 
36080 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68  in pTo before th
36090 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e  e copy operation
360a0 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  , journal page i
360b0 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a   from pTo..    *
360c0 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69 53 6b  /.    if( i!=iSk
360d0 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65  ip && i<=nToPage
360e0 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61 67 65   ){.      DbPage
360f0 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
36100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36110 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
36120 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62  >pPager, i, &pDb
36130 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
36140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36150 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
36160 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36170 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
36180 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36190 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50  E_OK && i>nFromP
361a0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
361b0 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65   /* Yeah.  It se
361c0 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c  ems wierd to cal
361d0 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69  l DontWrite() ri
361e0 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65 28  ght after Write(
361f0 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20 20  ). But.         
36200 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63 61   ** that is beca
36210 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  use the names of
36220 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65   those procedure
36230 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79  s do not exactly
36240 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72   .          ** r
36250 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68  epresent what th
36260 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20  ey do.  Write() 
36270 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75  really means "pu
36280 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74  t this page in t
36290 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
362a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
362b0 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20   and mark it as 
362c0 64 69 72 74 79 20 73 6f 20 74 68 61 74 20 69 74  dirty so that it
362d0 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
362e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
362f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36300 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74  le later."  Dont
36310 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74  Write() undoes t
36320 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f  he second part o
36330 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  f.          ** t
36340 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73  hat and prevents
36350 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62   the page from b
36360 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  eing written to 
36370 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68  the database. Th
36380 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
36390 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20  age is still on 
363a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
363b0 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41  rnal, though.  A
363c0 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20 0a  nd that is the .
363d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f            ** who
363e0 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  le point of this
363f0 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70   block: to put p
36400 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
36410 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  back journal. . 
36420 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
36430 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
36440 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50  erDontWrite(pDbP
36450 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
36460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
36470 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
36480 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
36490 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  }..    /* Overwr
364a0 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ite the data in 
364b0 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74 61  page i of the ta
364c0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rget database */
364d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
364e0 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b  ITE_OK && i!=iSk
364f0 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67  ip && i<=nNewPag
36500 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61  e ){..      DbPa
36510 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b  ge *pToPage = 0;
36520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
36530 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20  nt64 iOff;..    
36540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36550 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50  gerGet(pBtTo->pP
36560 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67  ager, i, &pToPag
36570 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
36580 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
365a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
365b0 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  oPage);.      }.
365c0 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20  .      for(.    
365d0 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e      iOff=(i-1)*n
365e0 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
365f0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
36600 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f  OK && iOff<i*nTo
36610 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
36620 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
36630 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29  PageSize.      )
36640 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  {.        DbPage
36650 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b   *pFromPage = 0;
36660 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
36670 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f  rom = (iOff/nFro
36680 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20  mPageSize)+1;.. 
36690 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
366a0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
366b0 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a  AGE(pBtFrom) ){.
366c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
366d0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ue;.        }.. 
366e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
366f0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
36700 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
36710 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
36720 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36740 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
36750 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
36760 47 65 74 44 61 74 61 28 70 54 6f 50 61 67 65 29  GetData(pToPage)
36770 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
36780 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
36790 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
367a0 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
367b0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a      int nCopy;..
367c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 46            if( nF
367d0 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f  romPageSize>=nTo
367e0 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
367f0 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d          zFrom +=
36800 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53   ((i-1)*nToPageS
36810 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29  ize - ((iFrom-1)
36820 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29  *nFromPageSize))
36830 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
36840 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a  opy = nToPageSiz
36850 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
36860 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
36870 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d  zTo += (((iFrom-
36880 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
36890 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67  ) - (i-1)*nToPag
368a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
368b0 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f      nCopy = nFro
368c0 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  mPageSize;.     
368d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
368e0 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46    memcpy(zTo, zF
368f0 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20  rom, nCopy);..  
36900 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36910 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
36920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36930 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50 61  .      if( pToPa
36940 67 65 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  ge ) sqlite3Page
36950 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b  rUnref(pToPage);
36960 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
36970 20 49 66 20 74 68 69 6e 67 73 20 68 61 76 65 20   If things have 
36980 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20 74  worked so far, t
36990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
369a0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
369b0 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e  .  ** truncated.
369c0 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61 72   The complex par
369d0 74 20 69 73 20 74 68 61 74 20 69 74 20 6d 61 79  t is that it may
369e0 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75 6e   need to be trun
369f0 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20  cated to.  ** a 
36a00 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f 74  size that is not
36a10 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
36a20 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65 53  iple of nToPageS
36a30 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e  ize - the curren
36a40 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a 65  t.  ** page size
36a50 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67   used by the pag
36a60 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
36a70 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20  th B-Tree pTo.. 
36a80 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61   **.  ** For exa
36a90 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70 61  mple, say the pa
36aa0 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20 69  ge-size of pTo i
36ab0 73 20 32 30 34 38 20 62 79 74 65 73 20 61 6e 64  s 2048 bytes and
36ac0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20   the original . 
36ad0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
36ae0 67 65 73 20 69 73 20 35 20 28 31 30 20 4b 42 20  ges is 5 (10 KB 
36af0 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d 20  file). If pFrom 
36b00 68 61 73 20 61 20 70 61 67 65 20 73 69 7a 65 20  has a page size 
36b10 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62 79  of 1024 .  ** by
36b20 74 65 73 20 61 6e 64 20 39 20 70 61 67 65 73 2c  tes and 9 pages,
36b30 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   then the file n
36b40 65 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e 63  eeds to be trunc
36b50 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a  ated to 9KB..  *
36b60 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
36b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
36b80 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d   nFromPageSize!=
36b90 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20  nToPageSize ){. 
36ba0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
36bb0 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
36bc0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 54  e3PagerFile(pBtT
36bd0 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  o->pPager);.    
36be0 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28 69    i64 iSize = (i
36bf0 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
36c00 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   * (i64)nFromPag
36c10 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f  e;.      i64 iNo
36c20 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50 61  w = (i64)((nToPa
36c30 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f  ge>nNewPage)?nTo
36c40 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a  Page:nNewPage) *
36c50 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
36c60 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69 50  e; .      i64 iP
36c70 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29 50  ending = ((i64)P
36c80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
36c90 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36 34  (pBtTo)-1) *(i64
36ca0 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20  )nToPageSize;.  
36cb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
36cc0 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20  Size<=iNow );.  
36cd0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74  .      /* Commit
36ce0 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63 73   phase one syncs
36cf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36d00 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
36d10 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20  h pTo .      ** 
36d20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f  containing the o
36d30 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49 74  riginal data. It
36d40 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20 74   does not sync t
36d50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36d60 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66  .      ** itself
36d70 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74 68  . After doing th
36d80 69 73 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  is it is safe to
36d90 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65 28   use OsTruncate(
36da0 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20 20  ) and other.    
36db0 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20 6f    ** file APIs o
36dc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36dd0 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ile directly..  
36de0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74      */.      pBt
36df0 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62  To->db = pTo->db
36e00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
36e10 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
36e20 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70  haseOne(pBtTo->p
36e30 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b  Pager, 0, 0, 1);
36e40 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a 65  .      if( iSize
36e50 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c  <iNow && rc==SQL
36e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36e80 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20  Truncate(pFile, 
36e90 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iSize);.      }.
36ea0 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20    .      /* The 
36eb0 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65 64  loop that copied
36ec0 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62   data from datab
36ed0 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  ase pFrom to pTo
36ee0 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a   did not.      *
36ef0 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * populate the l
36f00 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20 64  ocking page of d
36f10 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66 20  atabase pTo. If 
36f20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
36f30 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20  .      ** pFrom 
36f40 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
36f50 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68 69  that of pTo, thi
36f60 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61 74  s means some dat
36f70 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a will.      ** 
36f80 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f  not have been co
36f90 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  pied. .      **.
36fa0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 6c        ** This bl
36fb0 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20 6d  ock copies the m
36fc0 69 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  issing data from
36fd0 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20   database pFrom 
36fe0 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a  to pTo .      **
36ff0 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49 73   using file APIs
37000 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  . This is safe b
37010 65 63 61 75 73 65 20 61 74 20 74 68 69 73 20 70  ecause at this p
37020 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68 61  oint we know tha
37030 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f  t.      ** all o
37040 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
37050 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61 73  ata from pTo has
37060 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e 74   been synced int
37070 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
37080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74  journal file. At
37090 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
370a0 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f 20  ould be safe to 
370b0 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a 20  do anything at. 
370c0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74       ** all to t
370d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
370e0 20 65 78 63 65 70 74 20 74 72 75 6e 63 61 74 65   except truncate
370f0 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
37100 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
37110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37120 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67 65  _OK && nFromPage
37130 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65  Size<nToPageSize
37140 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64 69   && iSize>iPendi
37150 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ng){.        i64
37160 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66   iOff;.        f
37170 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 69 4f  or(.          iO
37180 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20  ff=iPending; .  
37190 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
371a0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69  TE_OK && iOff<(i
371b0 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53  Pending+nToPageS
371c0 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20  ize); .         
371d0 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
371e0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 29  geSize.        )
371f0 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
37200 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
37210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  0;.          Pgn
37220 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f  o iFrom = (iOff/
37230 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31  nFromPageSize)+1
37240 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
37250 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e  f( iFrom==PENDIN
37260 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46  G_BYTE_PAGE(pBtF
37270 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46  rom) || iFrom>nF
37280 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20  romPage ){.     
37290 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
372a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
372b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
372c0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
372d0 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
372e0 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67  iFrom, &pFromPag
372f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
37300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
37320 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c  har *zFrom = sql
37330 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
37340 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09  (pFromPage);.  .
37350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37360 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46 72  Write(pFile, zFr
37370 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  om, nFromPageSiz
37380 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  e, iOff);.      
37390 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
373a0 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
373b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
373c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
373d0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  }.  .      /* Sy
373e0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
373f0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  file */.      if
37400 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37410 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
37420 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
37430 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
37440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
37450 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
37460 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
37470 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ate(pBtTo->pPage
37480 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20  r, nNewPage);.  
37490 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
374a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
374b0 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69     pBtTo->pageSi
374c0 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20 20  zeFixed = 0;.   
374d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
374e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
374f0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
37500 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
37510 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
37520 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
37530 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
37540 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
37550 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
37560 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29 3b  BtreeEnter(pTo);
37570 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
37580 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72  nter(pFrom);.  r
37590 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69 6c  c = btreeCopyFil
375a0 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20  e(pTo, pFrom);. 
375b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
375c0 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c  ve(pFrom);.  sql
375d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
375e0 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  To);.  return rc
375f0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
37600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
37610 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
37620 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
37630 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
37640 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
37650 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
37660 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
37670 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
37680 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
37690 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
376a0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x) );.  return (
376b0 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
376c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
376d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
376e0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
376f0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
37700 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
37710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37720 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
37730 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
37740 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
37750 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
37760 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26  return (p->pBt &
37770 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74  & p->pBt->inStmt
37780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37790 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
377a0 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65 29   read (or write)
377b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
377c0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
377d0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
377e0 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a  eadTrans(Btree *
377f0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
37800 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37810 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
37820 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
37830 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
37840 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f  ANS_NONE));.}../
37850 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37860 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
37870 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f  nter to a blob o
37880 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
37890 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
378a0 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65  ngle shared-btre
378b0 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73  e. The memory is
378c0 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20   used by client 
378d0 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f 77 6e  code for its own
378e0 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f  .** purposes (fo
378f0 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74  r example, to st
37900 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c  ore a high-level
37910 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
37920 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
37930 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54  shared-btree). T
37940 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
37950 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65  anages reference
37960 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73   counting issues
37970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
37980 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
37990 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65  alled on a share
379a0 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20  d-btree, nBytes 
379b0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
379c0 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ** are allocated
379d0 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65  , zeroed, and re
379e0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
379f0 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73  ller. For each s
37a00 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61  ubsequent .** ca
37a10 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  ll the nBytes pa
37a20 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
37a30 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ed and a pointer
37a40 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f   to the same blo
37a50 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72  b.** of memory r
37a60 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
37a70 49 66 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  If the nBytes pa
37a80 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
37a90 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
37aa0 6f 72 79 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ory has not yet 
37ab0 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  been.** allocate
37ac0 64 2c 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  d, a null pointe
37ad0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  r is returned. I
37ae0 66 20 74 68 65 20 62 6c 6f 62 20 68 61 73 20 61  f the blob has a
37af0 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61  lready been.** a
37b00 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
37b10 72 65 74 75 72 6e 65 64 20 61 73 20 6e 6f 72 6d  returned as norm
37b20 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62  al..**.** Just b
37b30 65 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64  efore the shared
37b40 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64  -btree is closed
37b50 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  , the function p
37b60 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
37b70 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20   xFree argument 
37b80 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20  when the memory 
37b90 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d  allocation was m
37ba0 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ade is invoked o
37bb0 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f  n the .** blob o
37bc0 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  f allocated memo
37bd0 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ry. This functio
37be0 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c  n should not cal
37bf0 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
37c00 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72  .** on the memor
37c10 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  y, the btree lay
37c20 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  er does that..*/
37c30 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74  .void *sqlite3Bt
37c40 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65 20  reeSchema(Btree 
37c50 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  *p, int nBytes, 
37c60 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f 69  void(*xFree)(voi
37c70 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72 65  d *)){.  BtShare
37c80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
37c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
37ca0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 21  nter(p);.  if( !
37cb0 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 26 26 20  pBt->pSchema && 
37cc0 6e 42 79 74 65 73 20 29 7b 0a 20 20 20 20 70 42  nBytes ){.    pB
37cd0 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  t->pSchema = sql
37ce0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  ite3MallocZero(n
37cf0 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d  Bytes);.    pBt-
37d00 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78  >xFreeSchema = x
37d10 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Free;.  }.  sqli
37d20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37d30 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  ;.  return pBt->
37d40 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  pSchema;.}../*.*
37d50 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
37d60 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66   another user of
37d70 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65 64   the same shared
37d80 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72   btree as the ar
37d90 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65  gument.** handle
37da0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
37db0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
37dc0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
37dd0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
37de0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f  te3BtreeSchemaLo
37df0 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  cked(Btree *p){.
37e00 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
37e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37e20 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
37e30 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
37e40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
37e50 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62    rc = (queryTab
37e60 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
37e70 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
37e80 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  )!=SQLITE_OK);. 
37e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37ea0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
37eb0 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
37ec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
37ed0 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
37ee0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
37ef0 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
37f00 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
37f10 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
37f20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
37f30 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
37f40 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
37f50 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
37f60 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
37f70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
37f80 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
37f90 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
37fa0 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
37fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37fc0 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
37fd0 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63  le ){.    u8 loc
37fe0 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43  kType = READ_LOC
37ff0 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b  K + isWriteLock;
38000 0a 20 20 20 20 61 73 73 65 72 74 28 20 52 45 41  .    assert( REA
38010 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f  D_LOCK+1==WRITE_
38020 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
38030 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d  rt( isWriteLock=
38040 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63  =0 || isWriteLoc
38050 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  k==1 );.    sqli
38060 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
38070 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65 72 79  ;.    rc = query
38080 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
38090 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
380a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
380b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
380c0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69  = lockTable(p, i
380d0 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
380e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
380f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
38100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
38110 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
38120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38130 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72  NCRBLOB./*.** Ar
38140 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74  gument pCsr must
38150 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65   be a cursor ope
38160 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
38170 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59  on an .** INTKEY
38180 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
38190 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
381a0 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79  alid table entry
381b0 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  . .** This funct
381c0 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ion modifies the
381d0 20 64 61 74 61 20 73 74 6f 72 65 64 20 61 73 20   data stored as 
381e0 70 61 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74  part of that ent
381f0 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  ry..** Only the 
38200 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79  data content may
38210 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65   only be modifie
38220 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  d, it is not pos
38230 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e  sible.** to chan
38240 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ge the length of
38250 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   the data stored
38260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
38270 42 74 72 65 65 50 75 74 44 61 74 61 28 42 74 43  BtreePutData(BtC
38280 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32  ursor *pCsr, u32
38290 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
382a0 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73  , void *z){.  as
382b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
382c0 73 4d 75 74 65 78 28 70 43 73 72 29 20 29 3b 0a  sMutex(pCsr) );.
382d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
382e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 73  3_mutex_held(pCs
382f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
38300 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
38310 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c  t(pCsr->isIncrbl
38320 6f 62 48 61 6e 64 6c 65 29 3b 0a 0a 20 20 72 65  obHandle);..  re
38330 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
38340 69 6f 6e 28 70 43 73 72 29 3b 0a 20 20 61 73 73  ion(pCsr);.  ass
38350 65 72 74 28 20 70 43 73 72 2d 3e 65 53 74 61 74  ert( pCsr->eStat
38360 65 21 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e!=CURSOR_REQUIR
38370 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
38380 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Csr->eState!=CUR
38390 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
383a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
383b0 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BORT;.  }..  /* 
383c0 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65 63 6f  Check some preco
383d0 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a 2a 20  nditions: .  ** 
383e0 20 20 28 61 29 20 74 68 65 20 63 75 72 73 6f 72    (a) the cursor
383f0 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77 72 69   is open for wri
38400 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28 62 29  ting,.  **   (b)
38410 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   there is no rea
38420 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  d-lock on the ta
38430 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ble being modifi
38440 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  ed and.  **   (c
38450 29 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  ) the cursor poi
38460 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64 20 72  nts at a valid r
38470 6f 77 20 6f 66 20 61 6e 20 69