/ Hex Artifact Content
Login

Artifact 4ac764ea85af796a9fd4875edf07e7f208008871:


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 36 30 30 20 32 30 30 39 2f 30  c,v 1.600 2009/0
0190: 34 2f 33 30 20 30 31 3a 32 32 3a 34 31 20 64 72  4/30 01:22:41 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 6c 69 73 74 20 6f 66 20 42 74  .** A list of Bt
0450: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74  Shared objects t
0460: 68 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65  hat are eligible
0470: 20 66 6f 72 20 70 61 72 74 69 63 69 70 61 74 69   for participati
0480: 6f 6e 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20  on.** in shared 
0490: 63 61 63 68 65 2e 20 20 54 68 69 73 20 76 61 72  cache.  This var
04a0: 69 61 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73  iable has file s
04b0: 63 6f 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d  cope during norm
04c0: 61 6c 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75  al builds,.** bu
04d0: 74 20 74 68 65 20 74 65 73 74 20 68 61 72 6e 65  t the test harne
04e0: 73 73 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65  ss needs to acce
04f0: 73 73 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65  ss it so we make
0500: 20 69 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a   it global for .
0510: 2a 2a 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a  ** test builds..
0520: 2a 2a 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20  **.** Access to 
0530: 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  this variable is
0540: 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 53 51   protected by SQ
0550: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
0560: 43 5f 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66  C_MASTER..*/.#if
0570: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
0580: 42 74 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45  BtShared *SQLITE
0590: 5f 57 53 44 20 73 71 6c 69 74 65 33 53 68 61 72  _WSD sqlite3Shar
05a0: 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b  edCacheList = 0;
05b0: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74  .#else.static Bt
05c0: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
05d0: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
05e0: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
05f0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0610: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
0620: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0630: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0640: 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
0650: 73 61 62 6c 65 20 74 68 65 20 73 68 61 72 65 64  sable the shared
0660: 20 70 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d   pager and schem
0670: 61 20 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a  a features..**.*
0680: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
0690: 61 73 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  as no effect on 
06a0: 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
06b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a  e connections..*
06c0: 2a 20 54 68 65 20 73 68 61 72 65 64 20 63 61 63  * The shared cac
06d0: 68 65 20 73 65 74 74 69 6e 67 20 65 66 66 65 63  he setting effec
06e0: 74 73 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63  ts only future c
06f0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
0700: 65 33 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74  e3_open(), sqlit
0710: 65 33 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20  e3_open16(), or 
0720: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
0730: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
0740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
0750: 63 61 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65  cache(int enable
0760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  ){.  sqlite3Glob
0770: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
0780: 61 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e  acheEnabled = en
0790: 61 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  able;.  return S
07a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
07b0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  if.../*.** Forwa
07c0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
07d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
07e0: 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63  ckForReadConflic
07f0: 74 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c  ts(Btree*, Pgno,
0800: 20 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29   BtCursor*, i64)
0810: 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
0820: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0830: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0840: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0850: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
0860: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
0870: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0880: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
0890: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
08a0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
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 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0a20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0a30: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0a40: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0a50: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0a60: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0a70: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0a80: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a90: 63 6b 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23  cks(a).#endif..#
0aa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0ab0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0ac0: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73  /*.** Query to s
0ad0: 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64  ee if btree hand
0ae0: 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20  le p may obtain 
0af0: 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65  a lock of type e
0b00: 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c  Lock .** (READ_L
0b10: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
0b20: 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  K) on the table 
0b30: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
0b40: 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  Tab. Return.** S
0b50: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
0b60: 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61  lock may be obta
0b70: 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67  ined (by calling
0b80: 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61 63  .** setSharedCac
0b90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20  heTableLock()), 
0ba0: 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  or SQLITE_LOCKED
0bb0: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
0bc0: 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61 72  ic int queryShar
0bd0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0be0: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0bf0: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0c00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0c10: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0c20: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0c30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0c40: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0c50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
0c60: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
0c70: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
0c80: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
0c90: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a   p->db!=0 );.  .
0ca0: 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69    /* If requesti
0cb0: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c  ng a write-lock,
0cc0: 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65 20   then the Btree 
0cd0: 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65  must have an ope
0ce0: 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61  n write.  ** tra
0cf0: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73  nsaction on this
0d00: 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69   file. And, obvi
0d10: 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20  ously, for this 
0d20: 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a  to be so there .
0d30: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20    ** must be an 
0d40: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
0d50: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69  action on the fi
0d60: 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  le itself..  */.
0d70: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
0d80: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70  =READ_LOCK || (p
0d90: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26  ==pBt->pWriter &
0da0: 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
0db0: 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20  ANS_WRITE) );.  
0dc0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
0dd0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d  EAD_LOCK || pBt-
0de0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
0df0: 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
0e00: 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61   .  /* This is a
0e10: 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68   no-op if the sh
0e20: 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f  ared-cache is no
0e30: 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  t enabled */.  i
0e40: 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
0e50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0e60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
0e70: 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72  /* If some other
0e80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
0e90: 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  olding an exclus
0ea0: 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20  ive lock, the.  
0eb0: 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  ** requested loc
0ec0: 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74  k may not be obt
0ed0: 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ained..  */.  if
0ee0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d  ( pBt->pWriter!=
0ef0: 70 20 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c  p && pBt->isExcl
0f00: 75 73 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c  usive ){.    sql
0f10: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
0f20: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
0f30: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
0f40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0f50: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
0f60: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
0f70: 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68  This (along with
0f80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0f90: 61 62 6c 65 4c 6f 63 6b 28 29 29 20 69 73 20 77  ableLock()) is w
0fa0: 68 65 72 65 0a 20 20 2a 2a 20 74 68 65 20 52 65  here.  ** the Re
0fb0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0fc0: 61 67 20 69 73 20 64 65 61 6c 74 20 77 69 74 68  ag is dealt with
0fd0: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61  ..  ** If the ca
0fe0: 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67  ller is querying
0ff0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b   for a read-lock
1000: 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 0a 20 20   on any table.  
1010: 2a 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ** other than th
1020: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
1030: 74 61 62 6c 65 20 28 74 61 62 6c 65 20 31 29 20  table (table 1) 
1040: 61 6e 64 20 69 66 20 74 68 65 20 52 65 61 64 55  and if the ReadU
1050: 6e 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20  ncommitted.  ** 
1060: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
1070: 6e 20 74 68 65 20 6c 6f 63 6b 20 67 72 61 6e 74  n the lock grant
1080: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 72 65  ed even if there
1090: 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73   are write-locks
10a0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62  .  ** on the tab
10b0: 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c  le. If a write-l
10c0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
10d0: 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  , the ReadUncomm
10e0: 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20  itted flag.  ** 
10f0: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
1100: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  d..  **.  ** In 
1110: 66 75 6e 63 74 69 6f 6e 20 73 65 74 53 68 61 72  function setShar
1120: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1130: 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f  (), if a read-lo
1140: 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61  ck is demanded a
1150: 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61  nd the .  ** Rea
1160: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1170: 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74  g is set, no ent
1180: 72 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ry is added to t
1190: 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20  he locks list . 
11a0: 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c   ** (BtShared.pL
11b0: 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ock)..  **.  ** 
11c0: 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66  To summarize: If
11d0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
11e0: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
11f0: 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73  , then read curs
1200: 6f 72 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d  ors.  ** on non-
1210: 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f  schema tables do
1220: 20 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72   not create or r
1230: 65 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63  espect table loc
1240: 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  ks. The locking.
1250: 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66    ** procedure f
1260: 6f 72 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  or a write-curso
1270: 72 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67  r does not chang
1280: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  e..  */.  if( . 
1290: 20 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c     0==(p->db->fl
12a0: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
12b0: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a  ncommitted) || .
12c0: 20 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45      eLock==WRITE
12d0: 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61  _LOCK ||.    iTa
12e0: 62 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  b==MASTER_ROOT. 
12f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65   ){.    for(pIte
1300: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1310: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1320: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1330: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
1340: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
1350: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
1360: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
1370: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
1380: 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66  ent is a simplif
1390: 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20  ication of:.    
13a0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
13b0: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
13c0: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
13d0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
13e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
13f0: 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
1400: 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57  that if eLock==W
1410: 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20  RITE_LOCK, then 
1420: 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1430: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  ion.      ** may
1440: 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f   hold a WRITE_LO
1450: 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20  CK on any table 
1460: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69  in this file (si
1470: 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20  nce there can.  
1480: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
1490: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
14a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14b0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65  assert( pIter->e
14c0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
14d0: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
14e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
14f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f       assert( eLo
1500: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1510: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
1520: 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63  p || pIter->eLoc
1530: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  k==READ_LOCK);. 
1540: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
1550: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
1560: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1570: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
1580: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
1590: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
15a0: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
15b0: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
15c0: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  ->db);.        i
15d0: 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  f( eLock==WRITE_
15e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
15f0: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74    assert( p==pBt
1600: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1610: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
1620: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
1630: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74     }.        ret
1640: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1650: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1660: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1670: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1680: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1690: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
16a0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
16b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16c0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
16d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
16e0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
16f0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1700: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
1710: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
1720: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
1730: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
1740: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
1750: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
1760: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
1770: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1780: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1790: 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20  e lock is added 
17a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51  successfully. SQ
17b0: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
17c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
17d0: 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e  y also be return
17e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
17f0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
1800: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
1810: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
1820: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1830: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1840: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1850: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
1860: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
1870: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1880: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
18a0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
18b0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
18c0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
18d0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
18e0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
18f0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
1900: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
1910: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
1920: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1930: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1940: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  _OK;.  }..  asse
1950: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
1960: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1970: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1980: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
1990: 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d   /* If the read-
19a0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
19b0: 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65   is set and a re
19c0: 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ad-lock is reque
19d0: 73 74 65 64 20 6f 6e 0a 20 20 2a 2a 20 61 20 6e  sted on.  ** a n
19e0: 6f 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 2c  on-schema table,
19f0: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69   then the lock i
1a00: 73 20 61 6c 77 61 79 73 20 67 72 61 6e 74 65 64  s always granted
1a10: 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 0a  .  Return early.
1a20: 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 61 64 64    ** without add
1a30: 69 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  ing an entry to 
1a40: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
1a50: 63 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a  ck list. See.  *
1a60: 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e  * comment in fun
1a70: 63 74 69 6f 6e 20 71 75 65 72 79 53 68 61 72 65  ction queryShare
1a80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1a90: 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 0a  ) for more info.
1aa0: 20 20 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69 6e 67    ** on handling
1ab0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
1ac0: 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a  tted flag..  */.
1ad0: 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64    if( .    (p->d
1ae0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1af0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1b00: 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d   && .    (eLock=
1b10: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20  =READ_LOCK) &&. 
1b20: 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45     iTable!=MASTE
1b30: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1b40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1b60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
1b70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
1b80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
1b90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
1ba0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1bb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1bc0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1bd0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
1be0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
1bf0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
1c00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
1c10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
1c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1c30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1c40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
1c50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
1c60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
1c70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
1c80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
1c90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
1ca0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
1cb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
1cc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
1cd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
1ce0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
1cf0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
1d00: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
1d10: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
1d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1d30: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
1d40: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
1d60: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
1d70: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
1d80: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1d90: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
1da0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
1db0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
1dc0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
1dd0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
1de0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
1df0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
1e00: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
1e10: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
1e20: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
1e30: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
1e40: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
1e50: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
1e60: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
1e70: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
1e80: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e90: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
1ea0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
1eb0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
1ec0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
1ed0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1ee0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1ef0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1f00: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
1f10: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1f20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f30: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1f40: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
1f50: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
1f60: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
1f70: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
1f80: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
1f90: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1fa0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
1fb0: 64 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c  d by Btree handl
1fc0: 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e p..**.** This 
1fd0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1fe0: 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70 20 68   that handle p h
1ff0: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
2000: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
2010: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
2020: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
2030: 68 65 20 42 74 53 68 61 72 65 64 2e 69 73 50 65  he BtShared.isPe
2040: 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  nding variable.*
2050: 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72 65  * may be incorre
2060: 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ctly cleared..*/
2070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
2080: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
2090: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
20a0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
20b0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20c0: 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65    BtLock **ppIte
20d0: 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b  r = &pBt->pLock;
20e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20f0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2100: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2110: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  t( p->sharable |
2120: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
2130: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
2140: 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69  rans>0 );..  whi
2150: 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20  le( *ppIter ){. 
2160: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
2170: 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20   = *ppIter;.    
2180: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 45  assert( pBt->isE
2190: 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70  xclusive==0 || p
21a0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
21b0: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
21c0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
21d0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
21e0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
21f0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
2200: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
2210: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
2220: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
2230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2240: 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Lock);.    }else
2250: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
2260: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
2270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
2280: 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64  ert( pBt->isPend
2290: 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  ing==0 || pBt->p
22a0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
22b0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
22c0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
22d0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
22e0: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
22f0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
2300: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c  nding = 0;.  }el
2310: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
2330: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
2340: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
2350: 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  en connection p 
2360: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
2370: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
2380: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
2390: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
23a0: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
23b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
23c0: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
23d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
23e0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
23f0: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
2400: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
2410: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
2420: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
2430: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2440: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
2450: 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20   isPending flag 
2460: 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  to 0..    **.   
2470: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
2480: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20  not currently a 
2490: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53  writer, then BtS
24a0: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
24b0: 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a  must.    ** be z
24c0: 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20  ero already. So 
24d0: 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69  this next line i
24e0: 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68  s harmless in th
24f0: 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  at case..    */.
2500: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
2510: 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  ng = 0;.  }.}.#e
2520: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2530: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2540: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
2550: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
2560: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f  Page *pPage);  /
2570: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
2580: 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65  nce */../*.** Ve
2590: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
25a0: 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74  rsor holds a mut
25b0: 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
25c0: 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  ed.*/.#ifndef ND
25d0: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
25e0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  (BtCursor *p){. 
2600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
2610: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
2620: 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  t->mutex);.}.#en
2630: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
2640: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2650: 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  OB./*.** Invalid
2660: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
2670: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
2680: 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72   for cursor pCur
2690: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61  , if any..*/.sta
26a0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
26b0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
26c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26e0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26f0: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
2700: 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72  free(pCur->aOver
2710: 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61  flow);.  pCur->a
2720: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a  Overflow = 0;.}.
2730: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
2740: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
2750: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
2760: 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  or all cursors o
2770: 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  pened.** on the 
2780: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
2790: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73  ucture pBt..*/.s
27a0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
27b0: 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
27c0: 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a  Cache(BtShared *
27d0: 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
27e0: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
27f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2800: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2810: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2820: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2830: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c  Next){.    inval
2840: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
2850: 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  he(p);.  }.}.#el
2860: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  se.  #define inv
2870: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
2880: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
2890: 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  e invalidateAllO
28a0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
28b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
28c0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
28d0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
28e0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
28f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
2900: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
2910: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
2920: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
2930: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
2940: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
2950: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
2960: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
2970: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
2980: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
2990: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
29a0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
29b0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
29c0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
29d0: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
29e0: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
29f0: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
2a00: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
2a10: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
2a20: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
2a30: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
2a40: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
2a50: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
2a60: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a70: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
2a80: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
2a90: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
2aa0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
2ab0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
2ac0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
2ad0: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
2ae0: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
2af0: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
2b00: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
2b10: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
2b20: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
2b30: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
2b40: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
2b50: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
2b60: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
2b70: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
2b80: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
2b90: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2ba0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
2bb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2bc0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
2bd0: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
2be0: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
2bf0: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
2c00: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
2c10: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
2c20: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
2c30: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
2c40: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
2c50: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
2c60: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
2c70: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
2c80: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
2c90: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
2ca0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
2cb0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
2cc0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
2cd0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
2ce0: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
2cf0: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
2d00: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
2d10: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
2d20: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
2d30: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
2d40: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
2d50: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
2d60: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
2d70: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
2d80: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
2d90: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
2da0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
2db0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
2dc0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
2dd0: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
2de0: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
2df0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2e00: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
2e10: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
2e20: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
2e30: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
2e40: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
2e50: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
2e60: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
2e70: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
2e80: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
2e90: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2ea0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
2eb0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
2ec0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
2ed0: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
2ee0: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
2ef0: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
2f00: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
2f10: 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68  s ommitted if th
2f20: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2f30: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
2f40: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
2f50: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
2f60: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2f70: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
2f80: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
2f90: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
2fa0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
2fb0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
2fc0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
2fd0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2fe0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
2ff0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
3000: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
3010: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ent ){.    int n
3020: 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Page;.    rc = s
3030: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
3040: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
3050: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
3060: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3070: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
3080: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
3090: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
30a0: 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20  ((u32)nPage);.  
30b0: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
30c0: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
30d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
30f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
3100: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3110: 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69   pgno<=sqlite3Bi
3120: 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48  tvecSize(pBt->pH
3130: 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20  asContent) ){.  
3140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
3150: 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61  tvecSet(pBt->pHa
3160: 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b  sContent, pgno);
3170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79  ;.}../*.** Query
3190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
31a0: 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72  asContent vector
31b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
31c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31d0: 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  when a free-list
31e0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
31f0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  moved from the.*
3200: 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20  * free-list for 
3210: 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e  reuse. It return
3220: 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  s false if it is
3230: 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76   safe to retriev
3240: 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72  e the.** page fr
3250: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  om the pager lay
3260: 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
3270: 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
3280: 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73  t. True otherwis
3290: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32a0: 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74   btreeGetHasCont
32b0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
32c0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
32d0: 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74   Bitvec *p = pBt
32e0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20  ->pHasContent;. 
32f0: 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
3300: 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65  gno>sqlite3Bitve
3310: 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69  cSize(p) || sqli
3320: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c  te3BitvecTest(p,
3330: 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a   pgno)));.}../*.
3340: 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f  ** Clear (destro
3350: 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  y) the BtShared.
3360: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3370: 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  ec. This should 
3380: 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74  be.** invoked at
3390: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
33a0: 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72  of each write-tr
33b0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
33c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
33d0: 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42  learHasContent(B
33e0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
33f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
3400: 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43  stroy(pBt->pHasC
3410: 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e  ontent);.  pBt->
3420: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b  pHasContent = 0;
3430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
3440: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
3450: 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68  r position in th
3460: 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75  e variables BtCu
3470: 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e  rsor.nKey .** an
3480: 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e  d BtCursor.pKey.
3490: 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74   The cursor's st
34a0: 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55  ate is set to CU
34b0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
34c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34d0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
34e0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
34f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
3500: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
3510: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
3520: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
3530: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
3540: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
3550: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
3560: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
3570: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
3580: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
3590: 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Key);..  /* If t
35a0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
35b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
35c0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
35d0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
35e0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
35f0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
3600: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
3610: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
3620: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
3630: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
3640: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
3650: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
3660: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
3670: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
3680: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
3690: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
36a0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
36b0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
36c0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
36d0: 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43  LITE_OK && 0==pC
36e0: 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
36f0: 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64  ntKey){.    void
3700: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
3710: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
3720: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
3730: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
3740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
3750: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
3760: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
3770: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
3780: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3790: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
37a0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
37b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
37d0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
37e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
37f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
3800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
3810: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
3820: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
3830: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
3840: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
3850: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
3860: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
3870: 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
3880: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
3890: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
38a0: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
38b0: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
38c0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
38d0: 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
38e0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
38f0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
3900: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
3910: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3920: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
3930: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3940: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f  *.** Save the po
3950: 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63  sitions of all c
3960: 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45  ursors except pE
3970: 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68  xcept open on th
3980: 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68  e table .** with
3990: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
39a0: 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  . Usually, this 
39b0: 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62  is called just b
39c0: 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20  efore cursor.** 
39d0: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
39e0: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61  to modify the ta
39f0: 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65  ble (BtreeDelete
3a00: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
3a10: 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  t())..*/.static 
3a20: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
3a30: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
3a40: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
3a50: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
3a60: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3a70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3a90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
3aa0: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
3ab0: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
3ac0: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
3ad0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
3ae0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
3af0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
3b00: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
3b10: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
3b20: 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20  iRoot) && .     
3b30: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55     p->eState==CU
3b40: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
3b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
3b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3b70: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  p);.      if( SQ
3b80: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
3b90: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
3ba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3bb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3bc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3bd0: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
3be0: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
3bf0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
3c00: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
3c10: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
3c20: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
3c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3c40: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
3c50: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
3c60: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
3c70: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
3c80: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3c90: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
3ca0: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
3cb0: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
3cc0: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
3cd0: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
3ce0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
3cf0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
3d00: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
3d10: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
3d20: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
3d30: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
3d40: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
3d50: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
3d60: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
3d70: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
3d80: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
3d90: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
3da0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
3db0: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
3dc0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
3dd0: 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ion()..*/.int sq
3de0: 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72  lite3BtreeRestor
3df0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3e00: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
3e10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
3e20: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
3e30: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
3e40: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
3e50: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
3e60: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
3e70: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
3e80: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
3e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
3ea0: 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43  ->skip;.  }.  pC
3eb0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
3ec0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
3ed0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
3ee0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
3ef0: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
3f00: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
3f10: 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  kip);.  if( rc==
3f20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3f30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
3f40: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
3f50: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
3f60: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
3f70: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
3f80: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
3f90: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
3fa0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
3fb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
3fc0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
3fd0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
3fe0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
3ff0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
4000: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71   ? \.         sq
4010: 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72  lite3BtreeRestor
4020: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4030: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
4040: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
4050: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
4060: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
4070: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
4080: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
4090: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
40a0: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
40b0: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
40c0: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
40d0: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
40e0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
40f0: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
4100: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4110: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
4120: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
4130: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4140: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
4150: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
4160: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
4170: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
4180: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
4190: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
41a0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
41b0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
41c0: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
41d0: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
41e0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
41f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
4200: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
4210: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
4220: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
4230: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
4240: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
4250: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
4260: 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20  >skip!=0 ){.    
4270: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
4280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
4290: 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d  asMoved = 0;.  }
42a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
42b0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
42c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
42d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
42e0: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
42f0: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
4300: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
4310: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
4320: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
4330: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
4340: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
4350: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
4360: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
4370: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
4380: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
4390: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
43a0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
43b0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
43c0: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
43d0: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
43e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
43f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4400: 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65  x) );.  nPagesPe
4410: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
4420: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
4430: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
4440: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
4450: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
4460: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
4470: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
4480: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
4490: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
44a0: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
44b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
44c0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
44d0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
44e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
44f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4500: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
4510: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
4520: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
4530: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
4540: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
4550: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
4560: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
4570: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e  er 'pgno'..** An
4580: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
4590: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
45a0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
45b0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
45c0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
45d0: 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74  int ptrmapPut(Bt
45e0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
45f0: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
4600: 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20   Pgno parent){. 
4610: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
4620: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
4630: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
4640: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
4650: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
4660: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
4670: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
4680: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
4690: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
46a0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
46b0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
46c0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
46d0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
46e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
46f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
4700: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
4710: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
4720: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
4730: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
4740: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
4750: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
4760: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
4770: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
4780: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
4790: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
47a0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
47b0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
47c0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y==0 ){.    retu
47d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
47e0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50  T_BKPT;.  }.  iP
47f0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
4800: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
4810: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
4820: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
4830: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
4840: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
4850: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4860: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4870: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
4880: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
4890: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
48a0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
48b0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
48c0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
48d0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
48e0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
48f0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
4900: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
4910: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
4920: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
4930: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
4940: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
4950: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
4960: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
4970: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
4980: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4990: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
49a0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
49b0: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
49c0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
49d0: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
49e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
49f0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
4a00: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
4a10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4a20: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
4a30: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
4a40: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
4a50: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
4a60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
4a70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
4a80: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
4a90: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
4aa0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
4ab0: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
4ac0: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
4ad0: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
4ae0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
4af0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
4b00: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
4b10: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
4b20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4b30: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
4b40: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
4b50: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
4b60: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
4b70: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
4b80: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
4b90: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
4ba0: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
4bb0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
4bc0: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
4bd0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
4be0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
4bf0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
4c00: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
4c10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
4c20: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
4c30: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
4c40: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
4c50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4c60: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4c70: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
4c80: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
4c90: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
4ca0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
4cb0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
4cc0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
4cd0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
4ce0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
4cf0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
4d00: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
4d10: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
4d20: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
4d30: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
4d40: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
4d50: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
4d60: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
4d70: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
4d80: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
4d90: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
4da0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
4db0: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
4dc0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
4dd0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
4de0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
4df0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
4e10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e20: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
4e30: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
4e40: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
4e50: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
4e60: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29  rmapPut(w,x,y,z)
4e70: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
4e80: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
4e90: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
4ea0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
4eb0: 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20 53  apPutOvfl(y,z) S
4ec0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
4ed0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
4ee0: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
4ef0: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
4f00: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
4f10: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
4f20: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
4f30: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
4f40: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
4f50: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
4f60: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
4f70: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
4f80: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
4f90: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
4fa0: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
4fb0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
4fc0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
4fd0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
4fe0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
4ff0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
5000: 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b  yte(&(P)->aData[
5010: 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  (P)->cellOffset+
5020: 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a  2*(I)])))../*.**
5030: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
5040: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
5050: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
5060: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
5070: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
5080: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
5090: 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a  s.  See insert.*
50a0: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
50b0: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
50c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
50d0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
50e0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  i;.  assert( sql
50f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5100: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5110: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50  x) );.  for(i=pP
5120: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31  age->nOverflow-1
5130: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
5140: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72    int k;.    str
5150: 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70  uct _OvflCell *p
5160: 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20  Ovfl;.    pOvfl 
5170: 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  = &pPage->aOvfl[
5180: 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66  i];.    k = pOvf
5190: 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20  l->idx;.    if( 
51a0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
51b0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
51c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
51d0: 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20   pOvfl->pCell;. 
51e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65       }.      iCe
51f0: 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll--;.    }.  }.
5200: 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c    return findCel
5210: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
5220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
5230: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
5240: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
5250: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
5260: 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a  ructure.  There.
5270: 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  ** are two versi
5280: 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ons of this func
5290: 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74  tion.  sqlite3Bt
52a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
52b0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
52c0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
52d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
52e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
52f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
5300: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
5310: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
5320: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
5330: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
5340: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
5350: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
5360: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
5370: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
5380: 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ead of.** sqlite
5390: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
53a0: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
53b0: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
53c0: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
53d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
53e0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
53f0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
5400: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
5410: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
5420: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
5430: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
5440: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
5450: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
5460: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
5470: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
5480: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
5490: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
54a0: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
54b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
54c0: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
54d0: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
54e0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
54f0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
5500: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
5510: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
5520: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
5530: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5540: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5550: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
5560: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
5570: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5580: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
5590: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
55a0: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
55b0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
55c0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
55d0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
55e0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
55f0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
5600: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
5610: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
5620: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
5630: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
5640: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
5650: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
5660: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
5670: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
5680: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
5690: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
56a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
56b0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
56c0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
56d0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
56e0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
56f0: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
5700: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
5710: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
5720: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
5730: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
5740: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28  eader = n;.  if(
5750: 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64   likely(nPayload
5760: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
5770: 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  l) ){.    /* Thi
5780: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
5790: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
57a0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
57b0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
57c0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
57d0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
57e0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
57f0: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
5800: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
5810: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
5820: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
5830: 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65  tes */.    nSize
5840: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b   = nPayload + n;
5850: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
5860: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
5870: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
5880: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
5890: 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e    if( (nSize & ~
58a0: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  3)==0 ){.      n
58b0: 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20  Size = 4;       
58c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
58d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
58e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e    }.    pInfo->n
58f0: 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a  Size = (u16)nSiz
5900: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
5910: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
5920: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
5930: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
5940: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
5950: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
5960: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
5970: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
5980: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
5990: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
59a0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
59b0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
59c0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
59d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
59e0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
59f0: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
5a00: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
5a10: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
5a20: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
5a30: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
5a40: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
5a50: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
5a60: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
5a70: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
5a80: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
5a90: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
5aa0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
5ab0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
5ac0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
5ad0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
5ae0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
5af0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
5b00: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
5b10: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
5b20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
5b30: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
5b40: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
5b50: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
5b60: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
5b70: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
5b80: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
5b90: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
5ba0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
5bb0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
5bc0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
5bd0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
5be0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
5bf0: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
5c00: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
5c10: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
5c20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
5c30: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
5c40: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
5c50: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
5c60: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5c70: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
5c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
5c90: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
5ca0: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
5cb0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
5cc0: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
5cd0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
5ce0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
5cf0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
5d00: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
5d10: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
5d20: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
5d30: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69   pInfo) \.  sqli
5d40: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
5d50: 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69  lPtr((pPage), fi
5d60: 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20  ndCell((pPage), 
5d70: 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f  (iCell)), (pInfo
5d80: 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  )).void sqlite3B
5d90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
5da0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
5db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
5dc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5dd0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
5de0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
5df0: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
5e00: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
5e10: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
5e20: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
5e30: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
5e40: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
5e50: 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70  ){.  parseCell(p
5e60: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
5e70: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
5e80: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
5e90: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
5ea0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
5eb0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
5ec0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
5ed0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
5ee0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
5ef0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
5f00: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
5f10: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
5f20: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
5f30: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
5f40: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
5f50: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
5f60: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
5f70: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
5f80: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
5f90: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
5fa0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
5fb0: 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63   &pCell[pPage->c
5fc0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
5fd0: 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64  u32 nSize;..#ifd
5fe0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5ff0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
6000: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
6010: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
6020: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
6030: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
6040: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
6050: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
6060: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
6070: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
6080: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
6090: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
60a0: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
60b0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
60c0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
60d0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
60e0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
60f0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
6100: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
6110: 67 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  ginfo;.  sqlite3
6120: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
6130: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
6140: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
6150: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65  dif..  if( pPage
6160: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
6170: 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66  u8 *pEnd;.    if
6180: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
6190: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20   ){.      pIter 
61a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
61b0: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
61c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
61d0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
61e0: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
61f0: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
6200: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
6210: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
6220: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
6230: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
6240: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
6250: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
6260: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
6270: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
6280: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
6290: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
62a0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
62b0: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
62c0: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
62d0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
62e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
62f0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
6300: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
6310: 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  e);.  }..  if( n
6320: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
6330: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
6340: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
6350: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
6360: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
6370: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
6380: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
6390: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
63a0: 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  - 4);.    if( nS
63b0: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
63c0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
63d0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
63e0: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
63f0: 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65  = 4;.  }.  nSize
6400: 20 2b 3d 20 28 70 49 74 65 72 20 2d 20 70 43 65   += (pIter - pCe
6410: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  ll);..  /* The m
6420: 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  inimum size of a
6430: 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74  ny cell is 4 byt
6440: 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69  es. */.  if( nSi
6450: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ze<4 ){.    nSiz
6460: 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73  e = 4;.  }..  as
6470: 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62  sert( nSize==deb
6480: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  uginfo.nSize );.
6490: 20 20 72 65 74 75 72 6e 20 6e 53 69 7a 65 3b 0a    return nSize;.
64a0: 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
64b0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
64c0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
64d0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
64e0: 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53 69  .  return cellSi
64f0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  zePtr(pPage, fin
6500: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
6510: 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ll));.}.#endif..
6520: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6530: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
6540: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
6550: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
6560: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
6570: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
6580: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
6590: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
65a0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
65b0: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
65c0: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
65d0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
65e0: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
65f0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
6600: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
6610: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
6620: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
6630: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
6640: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
6650: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
6660: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
6670: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
6680: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
6690: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
66a0: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
66b0: 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  f( (info.nData+(
66c0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
66d0: 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f  info.nKey))>info
66e0: 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 50  .nLocal ){.    P
66f0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
6700: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
6710: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
6720: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
6730: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
6740: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
6750: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
6760: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
6770: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
6780: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
6790: 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c 6c  with index iCell
67a0: 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20 63   on page pPage c
67b0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
67c0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
67d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
67e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
67f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
6800: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
6810: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
6820: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
6830: 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Ovfl(MemPage *pP
6840: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
6850: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20  .  u8 *pCell;.  
6860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6870: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6880: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6890: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
68a0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
68b0: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
68c0: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
68d0: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
68e0: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
68f0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
6900: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
6910: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
6920: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
6930: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
6940: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
6950: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
6960: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
6970: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
6980: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
6990: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
69a0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
69b0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
69c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
69d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
69e0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
69f0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
6a00: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
6a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6a20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
6a30: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
6a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6a50: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
6a60: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
6a70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6a80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
6a90: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
6aa0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
6ab0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
6ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ad0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
6ae0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
6af0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
6b20: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
6b30: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
6b40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6b50: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
6b60: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
6b70: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
6b80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6b90: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
6ba0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
6bb0: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
6bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
6bd0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
6be0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
6bf0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c10: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
6c20: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
6c30: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6c40: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
6c50: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
6c60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6c70: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
6c80: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
6c90: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
6ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6cb0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
6cc0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
6cd0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6ce0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
6cf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
6d00: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6d10: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
6d20: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
6d30: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
6d40: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
6d50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6d60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6d70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6d80: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
6d90: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
6da0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
6db0: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
6dc0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
6dd0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6de0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
6df0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
6e00: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
6e10: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
6e20: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
6e30: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
6e40: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
6e50: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
6e60: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
6e70: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
6e80: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
6e90: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
6ea0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
6eb0: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
6ec0: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
6ed0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
6ee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
6ef0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
6f00: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
6f10: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
6f20: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
6f30: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
6f40: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
6f50: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
6f60: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70 63  ddr);.    if( pc
6f70: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
6f80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6f90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65  ;.    }.    size
6fb0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
6fc0: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
6fd0: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
6fe0: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
6ff0: 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  <cellOffset+2*nC
7000: 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  ell || pc+size>u
7010: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
7020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7030: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7040: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
7050: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
7060: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
7070: 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0 );.    memcpy(
7080: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
7090: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
70a0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
70b0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
70c0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65  assert( cbrk>=ce
70d0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
70e0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
70f0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
7100: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
7110: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
7120: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
7130: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61  [hdr+7] = 0;.  a
7140: 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ddr = cellOffset
7150: 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73  +2*nCell;.  mems
7160: 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  et(&data[addr], 
7170: 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20  0, cbrk-addr);. 
7180: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7190: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
71a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
71b0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 61   );.  if( cbrk-a
71c0: 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ddr!=pPage->nFre
71d0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
71e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
71f0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
7200: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7210: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
7220: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
7230: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
7240: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
7250: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
7260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
7270: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
7280: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
7290: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 0a 2a 2a  ata[] of the .**
72a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
72b0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
72c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
72d0: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
72e0: 74 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77  t the space betw
72f0: 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
7300: 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 0a  he cell-offset .
7310: 2a 2a 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  ** array and the
7320: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
7330: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
7340: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74  is at least nByt
7350: 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69  e bytes.** in si
7360: 7a 65 2e 20 53 6f 20 74 68 69 73 20 72 6f 75 74  ze. So this rout
7370: 69 6e 65 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ine can never fa
7380: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
7390: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 36  re are already 6
73a0: 30 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  0 or more bytes 
73b0: 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74  of fragments wit
73c0: 68 69 6e 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a  hin the page,.**
73d0: 20 74 68 65 20 70 61 67 65 20 69 73 20 64 65 66   the page is def
73e0: 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  ragmented before
73f0: 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 74   returning. If t
7400: 68 69 73 20 77 65 72 65 20 6e 6f 74 20 64 6f 6e  his were not don
7410: 65 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  e there.** is a 
7420: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
7430: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  number of fragme
7440: 6e 74 65 64 20 62 79 74 65 73 20 63 6f 75 6c 64  nted bytes could
7450: 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
7460: 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73 69 6e  overflow the sin
7470: 67 6c 65 2d 62 79 74 65 20 66 69 65 6c 64 20 6f  gle-byte field o
7480: 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
7490: 72 20 69 6e 20 77 68 69 63 68 20 74 68 69 73 20  r in which this 
74a0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 74 6f 72  value.** is stor
74b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
74c0: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
74d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
74e0: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 63 6f  int nByte){.  co
74f0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
7500: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
7510: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
7520: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
7530: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
7540: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
7550: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
7560: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7570: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
7580: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
75b0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
75c0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
75d0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  */.  int top;.  
75e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
75f0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
7600: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
7610: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
7620: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
7630: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7640: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7650: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7660: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
7670: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
7680: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
7690: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
76a0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
76b0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
76c0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
76d0: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  ==0 );..  /* Ass
76e0: 65 72 74 20 74 68 61 74 20 74 68 65 20 73 70 61  ert that the spa
76f0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  ce between the c
7700: 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72 72 61 79  ell-offset array
7710: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 63   and the .  ** c
7720: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
7730: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
7740: 20 6e 42 79 74 65 20 62 79 74 65 73 2e 0a 20 20   nByte bytes..  
7750: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  */.  assert( nBy
7760: 74 65 20 3c 3d 20 28 0a 20 20 20 20 20 20 67 65  te <= (.      ge
7770: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7780: 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28 70 50 61  +5])-(hdr+8+(pPa
7790: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 2b 32 2a  ge->leaf?0:4)+2*
77a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
77b0: 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b 0a 0a 20  dr+3])).  ));.. 
77c0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
77d0: 20 28 75 31 36 29 6e 42 79 74 65 3b 0a 20 20 6e   (u16)nByte;.  n
77e0: 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b  Frag = data[hdr+
77f0: 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  7];.  if( nFrag>
7800: 3d 36 30 20 29 7b 0a 20 20 20 20 64 65 66 72 61  =60 ){.    defra
7810: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
7820: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
7830: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
7840: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
7850: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
7860: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
7870: 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  sfy .    ** the 
7880: 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c  request. The all
7890: 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20  ocation is made 
78a0: 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66  from the first f
78b0: 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20  ree slot in .   
78c0: 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61   ** the list tha
78d0: 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
78e0: 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20  h to accomadate 
78f0: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
7900: 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20  nt pc, addr;.   
7910: 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b   for(addr=hdr+1;
7920: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
7930: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b  &data[addr]))>0;
7940: 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20   addr=pc){.     
7950: 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
7960: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7970: 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  );     /* Size o
7980: 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  f free slot */. 
7990: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
79a0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
79b0: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
79c0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Byte;.        if
79d0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
79e0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
79f0: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
7a00: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
7a10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
7a20: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67           ** frag
7a30: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
7a40: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
7a50: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
7a60: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
7a70: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
7a80: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
7a90: 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67  +7] = (u8)(nFrag
7aa0: 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d   + x);.        }
7ab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7ac0: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
7ad0: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
7ae0: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
7af0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
7b00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
7b10: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
7b20: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
7b30: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
7b40: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
7b50: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
7b60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7b70: 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20 78     return pc + x
7b80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7b90: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
7ba0: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
7bb0: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
7bc0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
7bd0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
7be0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
7bf0: 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20  nt area..  */.  
7c00: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
7c10: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e  data[hdr+5]) - n
7c20: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
7c30: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
7c40: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
7c50: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
7c60: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
7c70: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
7c80: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
7c90: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
7ca0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
7cb0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
7cc0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
7cd0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
7ce0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
7cf0: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
7d00: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
7d10: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
7d20: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
7d30: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
7d40: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
7d50: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
7d60: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
7d70: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
7d80: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
7d90: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
7da0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
7db0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
7dc0: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
7dd0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
7de0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
7df0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
7e00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
7e10: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
7e20: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
7e30: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
7e40: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
7e50: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
7e60: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
7e70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
7e80: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
7e90: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7ea0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
7eb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7ec0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
7ed0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
7ee0: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
7ef0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
7f00: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
7f10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
7f20: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
7f30: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
7f40: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
7f50: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
7f60: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
7f70: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
7f80: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
7f90: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
7fa0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
7fb0: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
7fc0: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
7fd0: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
7fe0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
7ff0: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
8000: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
8010: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
8020: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
8030: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
8040: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8050: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
8060: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
8070: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
8080: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
8090: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
80a0: 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64   if( pbegin<=add
80b0: 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  r ) {.      retu
80c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
80d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
80e0: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
80f0: 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67  .  }.  if ( pbeg
8100: 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  in>pPage->pBt->u
8110: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a  sableSize-4 ) {.
8120: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8130: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8140: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
8150: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
8160: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
8170: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
8180: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
8190: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
81a0: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
81b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
81c0: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
81d0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
81e0: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
81f0: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
8200: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
8210: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
8220: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
8230: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
8240: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
8250: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
8260: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
8270: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
8280: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
8290: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
82a0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
82b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
82c0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
82d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
82e0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
82f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
8300: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
8310: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
8320: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
8330: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
8340: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
8350: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
8360: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
8370: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
8380: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
8390: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
83a0: 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t+7]) ){.       
83b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
83c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
83d0: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
83e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
83f0: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
8400: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
8410: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
8420: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
8430: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
8440: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
8450: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
8460: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
8470: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
8480: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
8490: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
84a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
84b0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
84c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
84d0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
84e0: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
84f0: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
8500: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
8510: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
8520: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
8530: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
8540: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
8550: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
8560: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
8570: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
8580: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
8590: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
85a0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
85b0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
85c0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
85d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
85e0: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
85f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8600: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
8610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
8620: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
8630: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
8640: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8650: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
8660: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
8670: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
8680: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
8690: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
86a0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
86b0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
86c0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
86d0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
86e0: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
86f0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
8700: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
8710: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
8720: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
8730: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
8740: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
8750: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
8760: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
8770: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
8780: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
8790: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
87a0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
87b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
87c0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
87d0: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
87e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
87f0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
8800: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
8810: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
8820: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
8830: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
8840: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
8850: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
8860: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
8870: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
8880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
8890: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
88a0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
88b0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
88c0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
88d0: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
88e0: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
88f0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
8900: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
8910: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
8920: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
8930: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
8940: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
8950: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
8960: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
8970: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
8980: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
8990: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
89a0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
89b0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
89c0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
89d0: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
89e0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
89f0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
8a00: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
8a10: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
8a20: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
8a30: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
8a40: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
8a50: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
8a60: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
8a70: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
8a80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
8a90: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
8aa0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
8ab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8ac0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
8ad0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8ae0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
8af0: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
8b00: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
8b10: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
8b20: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
8b30: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
8b40: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
8b50: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
8b60: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
8b70: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
8b80: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
8b90: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
8ba0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
8bb0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
8bc0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
8bd0: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
8be0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8bf0: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
8c00: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
8c10: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
8c20: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
8c30: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
8c40: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
8c50: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
8c60: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
8c70: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
8c80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8c90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8ca0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8cb0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8cc0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
8cd0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
8ce0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
8cf0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8d00: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
8d10: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8d20: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8d30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8d40: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
8d50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8d60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8d70: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
8d80: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
8d90: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
8da0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
8db0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
8dc0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
8dd0: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
8de0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
8df0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
8e00: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
8e10: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
8e20: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
8e30: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
8e40: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
8e50: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
8e60: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
8e70: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
8e80: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
8e90: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
8ea0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
8eb0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
8ec0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
8ed0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
8ee0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
8ef0: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
8f00: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
8f10: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
8f20: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8f30: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
8f40: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8f50: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
8f60: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8f70: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
8f80: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8f90: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
8fa0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
8fb0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8fc0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
8fd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
8fe0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
8ff0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
9000: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
9010: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9020: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
9030: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
9040: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
9050: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
9060: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
9070: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
9080: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
9090: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
90a0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
90b0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
90c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
90d0: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
90e0: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
90f0: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
9100: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
9110: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
9120: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
9130: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
9140: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
9150: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
9160: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
9170: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
9180: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
9190: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
91a0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
91b0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
91c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
91d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
91e0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }.  .    /* Comp
91f0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
9200: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
9210: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
9220: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9230: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
9240: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
9250: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
9260: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9270: 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c  nCell);.    whil
9280: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
9290: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
92a0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
92b0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
92c0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
92d0: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
92e0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
92f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9300: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
9310: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
9320: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9330: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
9340: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9350: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9360: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
9370: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
9380: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
9390: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
93a0: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
93b0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  er */.        re
93c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
93d0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
93e0: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b   }.      nFree +
93f0: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  = size;.      pc
9400: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
9410: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
9420: 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a 20 20  = (u16)nFree;.  
9430: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
9440: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9450: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
9460: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
9470: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
9480: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9490: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
94a0: 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a  ; .    }..#if 0.
94b0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
94c0: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
94d0: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
94e0: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
94f0: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
9500: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
9510: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
9520: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
9530: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
9540: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
9550: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
9560: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
9570: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
9580: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
9590: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
95a0: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
95b0: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
95c0: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
95d0: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
95e0: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
95f0: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
9600: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
9610: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
9620: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
9630: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
9640: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
9650: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
9660: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
9670: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
9680: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
9690: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
96a0: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
96b0: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
96c0: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
96d0: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
96e0: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
96f0: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
9700: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
9710: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
9720: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
9730: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
9740: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
9750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9760: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9770: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
9780: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
9790: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
97a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
97b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
97c0: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
97d0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
97e0: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
97f0: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
9800: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
9810: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
9820: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9830: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
9840: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
9850: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9860: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
9870: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
9880: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
9890: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
98a0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
98b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
98c0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
98d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
98e0: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
98f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9900: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
9910: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
9920: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
9930: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9940: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
9950: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
9960: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
9970: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9980: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9990: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
99a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
99b0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
99c0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
99d0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
99e0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
99f0: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
9a00: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
9a10: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
9a20: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
9a30: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
9a40: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
9a50: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
9a60: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
9a70: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
9a80: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9a90: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
9aa0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
9ab0: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
9ac0: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
9ad0: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
9ae0: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
9af0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
9b00: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
9b10: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
9b20: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
9b30: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
9b40: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
9b50: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
9b60: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
9b70: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
9b80: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
9b90: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
9ba0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
9bb0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
9bc0: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
9bd0: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
9be0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
9bf0: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
9c00: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
9c10: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
9c20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
9c30: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
9c40: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
9c50: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
9c60: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
9c70: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
9c80: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
9c90: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
9ca0: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
9cb0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
9cc0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
9cd0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
9ce0: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
9cf0: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
9d00: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
9d10: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
9d20: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
9d30: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
9d40: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
9d50: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
9d60: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
9d70: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
9d80: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
9d90: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
9da0: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
9db0: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
9dc0: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
9dd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
9de0: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
9df0: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
9e00: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
9e10: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
9e20: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
9e30: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
9e40: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
9e50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
9e60: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
9e70: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
9e80: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
9e90: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
9ea0: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
9eb0: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
9ec0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
9ed0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
9ee0: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
9ef0: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
9f00: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
9f10: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
9f20: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
9f30: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
9f40: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
9f50: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
9f60: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
9f70: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
9f80: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
9f90: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
9fa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9fb0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
9fc0: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
9fd0: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
9fe0: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
9ff0: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
a000: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
a010: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
a020: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
a030: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
a040: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
a050: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
a060: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
a070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a080: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
a090: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
a0a0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
a0b0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
a0c0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
a0d0: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
a0e0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a0f0: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
a100: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
a110: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
a120: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
a130: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a140: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
a150: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
a160: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
a170: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
a180: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
a190: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
a1a0: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
a1b0: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
a1c0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
a1d0: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
a1e0: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
a1f0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a200: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
a210: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
a220: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
a230: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
a240: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
a250: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a260: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
a270: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
a280: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
a290: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
a2a0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
a2b0: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
a2c0: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
a2d0: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
a2e0: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
a2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
a300: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
a310: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
a320: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
a330: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
a340: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
a350: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
a360: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
a370: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
a380: 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o pagerPagecount
a390: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
a3a0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d  .  int nPage = -
a3b0: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
a3c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
a3d0: 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  e1 );.  rc = sql
a3e0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
a3f0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
a400: 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  &nPage);.  asser
a410: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
a420: 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b   || nPage==-1 );
a430: 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29  .  return (Pgno)
a440: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
a450: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
a460: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
a470: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
a480: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
a490: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
a4a0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
a4b0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
a4c0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
a4d0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
a4e0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
a4f0: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
a500: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
a510: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
a520: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
a530: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
a540: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
a550: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
a560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
a570: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
a580: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
a590: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
a5a0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
a5b0: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
a5c0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
a5d0: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
a5e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a5f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
a600: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
a610: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a630: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
a640: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
a650: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
a660: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
a670: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
a680: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
a690: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
a6a0: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
a6b0: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
a6c0: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
a6d0: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
a6e0: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
a6f0: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
a700: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
a710: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
a720: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
a730: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
a740: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
a750: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
a760: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
a770: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
a780: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
a790: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
a7a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a7b0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
a7c0: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
a7d0: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
a7e0: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
a7f0: 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
a800: 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
a810: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a820: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
a830: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
a840: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
a850: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
a860: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
a870: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a880: 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70  .    pPage = *pp
a890: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
a8a0: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
a8b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
a8c0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
a8d0: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pPage);.  }.  if
a8e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8f0: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
a900: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a  ge(pPage);.    *
a910: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
a920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a930: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
a940: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
a950: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
a960: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
a970: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
a980: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
a990: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
a9a0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
a9b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
a9c0: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
a9d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a9e0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
a9f0: 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
aa00: 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  geRefcount(pPage
aa10: 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a  ->pDbPage)>1 );.
aa20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aa30: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
aa40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
aa50: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
aa60: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
aa70: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
aa80: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
aa90: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
aaa0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
aab0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
aac0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
aad0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
aae0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
aaf0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ab00: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ab10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ab20: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
ab30: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
ab40: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
ab50: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
ab60: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
ab70: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
ab80: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
ab90: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
aba0: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
abb0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
abc0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
abd0: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
abe0: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
abf0: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
ac00: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ac10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
ac20: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
ac30: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
ac40: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
ac50: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
ac60: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
ac70: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
ac80: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
ac90: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
aca0: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
acb0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
acc0: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
acd0: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
ace0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
acf0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
ad00: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
ad10: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
ad20: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
ad30: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
ad40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ad50: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ad60: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ad70: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
ad80: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
ad90: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
ada0: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
adb0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
adc0: 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
add0: 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
ade0: 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
adf0: 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
ae00: 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
ae10: 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
ae20: 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
ae30: 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
ae40: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
ae50: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
ae60: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
ae70: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
ae80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
ae90: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
aea0: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
aeb0: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
aec0: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
aed0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  at.      ** sqli
aee0: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
aef0: 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  () be called on 
af00: 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65  every btree page
af10: 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20   so we make.    
af20: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f    ** the call fo
af30: 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  r every page tha
af40: 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72  t comes in for r
af50: 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  e-initing. */.  
af60: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
af70: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
af80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
af90: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
afa0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
afb0: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
afc0: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
afd0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
afe0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
aff0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
b000: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
b010: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
b020: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b030: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b040: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
b050: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
b060: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
b070: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
b080: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
b090: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
b0a0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
b0b0: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
b0c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
b0d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
b0e0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
b0f0: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
b100: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
b110: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
b120: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
b130: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
b140: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
b150: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
b160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
b170: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
b180: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
b190: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
b1a0: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
b1b0: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
b1c0: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
b1d0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
b1e0: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
b1f0: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
b200: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
b210: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
b220: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
b230: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
b240: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b250: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
b260: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
b270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b280: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
b290: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
b2a0: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
b2b0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b2c0: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
b2d0: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
b2e0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
b2f0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
b300: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
b310: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
b320: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
b330: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
b340: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
b350: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
b360: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
b370: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b380: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
b390: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
b3a0: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
b3b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
b3c0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
b3d0: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
b3e0: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
b3f0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b400: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
b410: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
b420: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
b430: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
b440: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
b450: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
b460: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
b470: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b480: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
b490: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
b4a0: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
b4b0: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
b4c0: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
b4d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
b4e0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
b4f0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b500: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
b510: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
b520: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
b530: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
b540: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
b550: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
b560: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
b570: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
b580: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
b590: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
b5a0: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
b5b0: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
b5c0: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
b5d0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
b5e0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
b5f0: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
b600: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
b610: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
b620: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
b630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b640: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
b650: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
b660: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
b670: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
b680: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
b690: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
b6a0: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
b6b0: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
b6c0: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
b6d0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
b6e0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
b6f0: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
b700: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
b710: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
b720: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b730: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
b740: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
b750: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
b760: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
b770: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
b780: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
b790: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b7a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
b7b0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
b7c0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
b7d0: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
b7e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
b800: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
b810: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
b820: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
b830: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
b840: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
b850: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
b860: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
b870: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
b880: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
b890: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
b8a0: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
b8b0: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
b8c0: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
b8d0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
b8e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
b8f0: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
b900: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
b910: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
b920: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
b930: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
b940: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
b950: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c  lite3Malloc(nFul
b960: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
b970: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
b980: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
b990: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
b9a0: 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66  = 1;.      db->f
b9b0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
b9c0: 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20  haredCache;.    
b9d0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
b9e0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
b9f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ba00: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ba10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ba20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ba30: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
ba40: 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
ba50: 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, nFullPathname
ba60: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
ba70: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  ;.      mutexOpe
ba80: 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
ba90: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
baa0: 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
bab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
bac0: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
bad0: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
bae0: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
baf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
bb00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
bb10: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
bb20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
bb30: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
bb40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  ;.      for(pBt=
bb50: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
bb60: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
bb70: 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
bb80: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
bb90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bba0: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
bbb0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
bbc0: 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
bbd0: 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
bbe0: 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
bbf0: 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
bc00: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
bc10: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
bc20: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
bc30: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
bc40: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
bc50: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
bc60: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bc70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc80: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bc90: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
bca0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
bcb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
bcc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
bcd0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
bce0: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
bcf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
bd00: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
bd10: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
bd20: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
bd30: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
bd40: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
bd50: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
bd60: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
bd70: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
bd80: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
bd90: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
bda0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
bdb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
bdc0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
bdd0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
bde0: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
bdf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
be00: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
be10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
be20: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
be30: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
be40: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
be50: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
be60: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
be70: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
be80: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
be90: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
bea0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
beb0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
bec0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
bed0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
bee0: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
bef0: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
bf00: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
bf10: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
bf20: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
bf30: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
bf40: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
bf50: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
bf60: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
bf70: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
bf80: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
bf90: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
bfa0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
bfb0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
bfc0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
bfd0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
bfe0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
bff0: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
c000: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
c010: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
c020: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
c030: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
c040: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
c050: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
c060: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
c070: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
c0a0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
c0b0: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  gs);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c0d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c0e0: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
c0f0: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
c100: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
c110: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
c120: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
c130: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c140: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
c150: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
c160: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
c170: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c180: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
c190: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
c1a0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
c1b0: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
c1c0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
c1d0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
c1e0: 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e  etReiniter(pBt->
c1f0: 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e  pPager, pageRein
c200: 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43  it);.    pBt->pC
c210: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
c220: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
c230: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
c240: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
c250: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
c260: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
c270: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74  ->pageSize = get
c280: 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  2byte(&zDbHeader
c290: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [16]);.    if( p
c2a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
c2b0: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
c2c0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
c2d0: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
c2e0: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
c2f0: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
c300: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
c310: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
c320: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
c330: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c340: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
c350: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
c360: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
c370: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
c380: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
c390: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
c3a0: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
c3b0: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
c3c0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
c3d0: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
c3e0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
c3f0: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
c400: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
c410: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
c420: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
c430: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
c440: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
c450: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
c460: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
c470: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
c480: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
c490: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
c4a0: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
c4b0: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
c4c0: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
c4d0: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
c4e0: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
c4f0: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
c500: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
c510: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
c520: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
c530: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
c540: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
c550: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
c560: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
c570: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
c580: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
c590: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
c5a0: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
c5b0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c5c0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
c5d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c5e0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
c5f0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
c600: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
c610: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
c620: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
c630: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
c640: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
c650: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
c660: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
c670: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
c680: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
c690: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
c6a0: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
c6b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c6c0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
c6d0: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
c6e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
c6f0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
c700: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
c710: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
c720: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
c730: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
c740: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
c750: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
c760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
c770: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
c780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c790: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
c7a0: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
c7b0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
c7c0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
c7d0: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
c7e0: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
c7f0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
c800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c810: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
c820: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
c830: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
c840: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
c850: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
c860: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
c870: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
c880: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
c890: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
c8a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
c8b0: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
c8c0: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
c8d0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
c8e0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
c8f0: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
c900: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
c910: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
c920: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
c930: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
c940: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
c950: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
c960: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
c970: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c980: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
c990: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
c9a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
c9b0: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
c9c0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
c9d0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
c9e0: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
c9f0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
ca00: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
ca10: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
ca20: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
ca30: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
ca40: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
ca50: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
ca60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ca70: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
ca80: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ca90: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
caa0: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
cab0: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
cac0: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
cad0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
cae0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
caf0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
cb00: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
cb10: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
cb20: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
cb30: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
cb40: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
cb50: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
cb60: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
cb70: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
cb80: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
cb90: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
cba0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
cbb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
cbc0: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
cbd0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
cbe0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
cbf0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
cc00: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
cc10: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
cc20: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
cc30: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
cc40: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
cc50: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
cc60: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
cc70: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
cc80: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
cc90: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
cca0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
ccb0: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
ccc0: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
ccd0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
cce0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
ccf0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
cd00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd10: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
cd20: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
cd30: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
cd40: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
cd50: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
cd60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
cd70: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
cd80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
cd90: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
cda0: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
cdb0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
cdc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cdd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
cde0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
cdf0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
ce00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ce10: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
ce20: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
ce30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
ce40: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
ce50: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
ce60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
ce70: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
ce80: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
ce90: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
cea0: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
ceb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
cec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ced0: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
cee0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
cef0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
cf00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cf10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
cf20: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
cf30: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
cf40: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
cf50: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
cf60: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
cf70: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
cf80: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
cf90: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
cfa0: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
cfb0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
cfc0: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
cfd0: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
cfe0: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
cff0: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
d000: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
d010: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
d020: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
d030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d040: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
d050: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
d060: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
d070: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
d080: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
d090: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d0a0: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
d0b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
d0c0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
d0d0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
d0e0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
d0f0: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
d100: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
d110: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
d120: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
d130: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
d140: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
d150: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
d160: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
d170: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
d180: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
d190: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
d1a0: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
d1b0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
d1c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
d1d0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
d1e0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
d1f0: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
d200: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
d210: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
d220: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
d230: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
d240: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
d250: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
d260: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
d270: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
d280: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
d290: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d2a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
d2b0: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
d2c0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
d2d0: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
d2e0: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
d2f0: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
d300: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
d310: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
d320: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
d330: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
d340: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
d350: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
d360: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
d370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
d380: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
d390: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
d3a0: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
d3b0: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
d3c0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
d3d0: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
d3e0: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
d3f0: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
d400: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
d410: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
d420: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
d430: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
d440: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
d450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
d460: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
d470: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
d480: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
d490: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
d4a0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
d4b0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
d4c0: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
d4d0: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
d4e0: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
d4f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d500: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
d510: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
d520: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
d530: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
d540: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
d550: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
d560: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
d570: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
d580: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d590: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
d5a0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
d5b0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
d5c0: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
d5d0: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
d5e0: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
d5f0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
d600: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
d610: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
d620: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
d630: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
d640: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
d650: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
d660: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
d670: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
d680: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
d690: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
d6a0: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
d6b0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
d6c0: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
d6d0: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
d6e0: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
d6f0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
d700: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
d710: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
d720: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
d730: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
d740: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
d750: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
d760: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
d770: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
d780: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
d790: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
d7a0: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
d7b0: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
d7c0: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
d7d0: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
d7e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
d7f0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
d800: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
d810: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
d820: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
d830: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
d840: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
d850: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
d860: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
d870: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
d880: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
d890: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
d8a0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
d8b0: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
d8c0: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
d8d0: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
d8e0: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
d8f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
d900: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
d910: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
d920: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
d930: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
d940: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
d950: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
d960: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
d970: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
d980: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
d990: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
d9a0: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
d9b0: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
d9c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
d9d0: 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
d9e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d9f0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
da00: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
da10: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
da20: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
da30: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
da40: 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
da50: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
da60: 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
da70: 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
da80: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
da90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
daa0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
dab0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
dad0: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
dae0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
daf0: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
db00: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
db10: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
db20: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
db30: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
db40: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
db50: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
db60: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
db70: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
db80: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
db90: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
dba0: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
dbb0: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
dbc0: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
dbd0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
dbe0: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
dbf0: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
dc00: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
dc10: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
dc20: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
dc30: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
dc40: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
dc50: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
dc60: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
dc70: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
dc80: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
dc90: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
dca0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
dcb0: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
dcc0: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
dcd0: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
dce0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
dcf0: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
dd00: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
dd10: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
dd20: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
dd30: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
dd40: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
dd50: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
dd60: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
dd70: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
dd80: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
dd90: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
dda0: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
ddb0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
ddc0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
ddd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dde0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
ddf0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
de00: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
de10: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
de20: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
de30: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
de40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
de50: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
de60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
de70: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
de80: 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
de90: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
dea0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
deb0: 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
dec0: 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
ded0: 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
dee0: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
def0: 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
df00: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
df10: 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
df20: 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
df30: 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
df40: 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
df50: 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
df60: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
df70: 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
df80: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
df90: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
dfa0: 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
dfb0: 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
dfc0: 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
dfd0: 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
dfe0: 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
dff0: 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
e000: 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
e010: 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
e020: 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
e030: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e040: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
e050: 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
e060: 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
e070: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
e080: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
e090: 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
e0a0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
e0b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e0c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
e0d0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
e0e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e0f0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
e100: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
e110: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
e120: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
e130: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e140: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e150: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
e160: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
e170: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
e180: 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
e190: 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
e1a0: 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
e1b0: 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
e1c0: 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
e1d0: 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
e1e0: 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
e1f0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e200: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
e210: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
e220: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e230: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
e240: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e250: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
e260: 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
e270: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e280: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
e290: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
e2a0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
e2b0: 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
e2c0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
e2d0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
e2e0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
e2f0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
e300: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
e310: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
e320: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e330: 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
e340: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
e350: 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
e360: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
e370: 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
e380: 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
e390: 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
e3a0: 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
e3b0: 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
e3c0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
e3d0: 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
e3e0: 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
e3f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
e400: 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
e410: 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
e420: 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
e430: 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
e440: 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
e450: 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
e460: 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
e470: 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
e480: 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
e490: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
e4a0: 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
e4b0: 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
e4c0: 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
e4d0: 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
e4e0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e4f0: 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
e500: 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
e510: 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
e520: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
e530: 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
e540: 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
e550: 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
e560: 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
e570: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
e580: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
e590: 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
e5a0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
e5b0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
e5c0: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
e5d0: 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
e5e0: 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
e5f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
e600: 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
e610: 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  e pageSizeFixed 
e620: 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
e630: 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
e640: 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
e650: 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
e660: 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
e670: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e680: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
e690: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
e6a0: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
e6b0: 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
e6c0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e6d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
e6e0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
e6f0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
e700: 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
e710: 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
e720: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
e730: 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
e740: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
e750: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
e760: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
e770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
e780: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
e790: 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
e7a0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
e7b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
e7c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
e7d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
e7e0: 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
e7f0: 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
e800: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
e810: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
e820: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
e830: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
e840: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
e850: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
e860: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
e870: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
e880: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
e890: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
e8a0: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
e8b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
e8c0: 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
e8d0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
e8e0: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
e8f0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
e900: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
e910: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
e920: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ze);.  }.  pBt->
e930: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
e940: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
e950: 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
e960: 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
e970: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
e980: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e990: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e9a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
e9b0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
e9c0: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
e9d0: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
e9e0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
e9f0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
ea00: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
ea10: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
ea20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
ea30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
ea40: 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
ea50: 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
ea60: 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
ea70: 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
ea80: 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
ea90: 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
eaa0: 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
eab0: 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
eac0: 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
ead0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
eae0: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
eaf0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
eb00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
eb10: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
eb20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
eb30: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
eb40: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
eb50: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
eb60: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
eb70: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
eb80: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
eb90: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
eba0: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
ebb0: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
ebc0: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
ebd0: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
ebe0: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
ebf0: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
ec00: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
ec10: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
ec20: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
ec30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
ec40: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
ec50: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
ec60: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
ec70: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
ec80: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
ec90: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
eca0: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
ecb0: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
ecc0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
ecd0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
ece0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
ecf0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
ed00: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
ed10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ed20: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
ed30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
ed40: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
ed50: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
ed60: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
ed70: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
ed80: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
ed90: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
eda0: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
edb0: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
edc0: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
edd0: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
ede0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
edf0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
ee00: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
ee10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
ee20: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
ee30: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
ee40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ee50: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
ee60: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
ee70: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
ee80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ee90: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
eea0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
eeb0: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
eec0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
eed0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
eee0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
eef0: 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
ef00: 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
ef10: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
ef20: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
ef30: 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
ef40: 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
ef50: 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
ef60: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
ef70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
ef80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
ef90: 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
efa0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
efb0: 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
efc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
efd0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
efe0: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
eff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
f000: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
f010: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
f020: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
f030: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
f040: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
f050: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
f060: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
f070: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
f080: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
f090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f0a0: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
f0b0: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
f0c0: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
f0d0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
f0e0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
f0f0: 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
f100: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
f110: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
f120: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
f130: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
f140: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
f150: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
f160: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
f170: 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
f180: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f190: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
f1a0: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
f1b0: 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
f1c0: 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
f1d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
f1e0: 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
f1f0: 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
f200: 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
f210: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
f220: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
f230: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
f240: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
f250: 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
f260: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
f270: 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
f280: 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
f290: 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
f2a0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
f2b0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
f2c0: 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
f2d0: 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
f2e0: 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
f2f0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
f300: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
f310: 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
f320: 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
f330: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
f340: 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
f350: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f360: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
f370: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
f380: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
f390: 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
f3a0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
f3b0: 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
f3c0: 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
f3d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
f3e0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
f3f0: 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
f400: 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
f410: 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
f420: 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
f430: 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
f440: 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
f450: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
f460: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
f470: 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
f480: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f490: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
f4a0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
f4b0: 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  led;.  }else if(
f4c0: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
f4d0: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  int pageSize;.  
f4e0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
f4f0: 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
f500: 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
f510: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
f520: 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
f530: 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
f540: 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
f550: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
f560: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
f570: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
f580: 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
f590: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61  {.      pBt->rea
f5a0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dOnly = 1;.    }
f5b0: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
f5c0: 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
f5d0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
f5e0: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
f5f0: 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
f600: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
f610: 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
f620: 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
f630: 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
f640: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
f650: 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
f660: 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
f670: 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
f680: 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
f690: 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
f6a0: 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
f6b0: 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
f6c0: 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
f6d0: 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
f6e0: 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
f6f0: 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
f700: 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
f710: 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
f720: 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
f730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
f740: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
f750: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
f760: 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
f770: 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
f780: 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
f790: 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
f7a0: 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
f7b0: 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
f7c0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
f7d0: 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
f7e0: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
f7f0: 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
f800: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
f810: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
f820: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
f830: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
f840: 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
f850: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
f860: 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
f870: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
f880: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
f890: 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
f8a0: 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
f8b0: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
f8c0: 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
f8d0: 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
f8e0: 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
f8f0: 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
f900: 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
f910: 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
f920: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
f930: 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
f940: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
f950: 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
f960: 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
f970: 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
f980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
f990: 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
f9a0: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
f9b0: 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
f9c0: 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
f9d0: 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
f9e0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
f9f0: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
fa00: 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
fa10: 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
fa20: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
fa30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
fa40: 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
fa50: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
fa60: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
fa70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
fa80: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
fa90: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
faa0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
fab0: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 70 61 67  f( rc ) goto pag
fac0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
fad0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fae0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
faf0: 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
fb00: 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <500 ){.      go
fb10: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
fb20: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
fb30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
fb40: 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
fb50: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
fb60: 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65  ze = (u16)usable
fb70: 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
fb80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
fb90: 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
fba0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
fbb0: 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
fbc0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
fbd0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
fbe0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
fbf0: 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
fc00: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
fc10: 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
fc20: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
fc30: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
fc40: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
fc50: 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
fc60: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
fc70: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
fc80: 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
fc90: 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
fca0: 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
fcb0: 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
fcc0: 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
fcd0: 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
fce0: 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
fcf0: 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
fd00: 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
fd10: 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
fd20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
fd30: 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
fd40: 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
fd50: 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
fd60: 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
fd70: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
fd80: 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
fd90: 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
fda0: 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
fdb0: 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
fdc0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
fdd0: 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65  yte poiner, a he
fde0: 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73  ader which is as
fdf0: 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37   much as.  ** 17
fe00: 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74   bytes long, 0 t
fe10: 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79  o N bytes of pay
fe20: 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74  load, and an opt
fe30: 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65  ional 4 byte ove
fe40: 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20  rflow.  ** page 
fe50: 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  pointer..  */.  
fe60: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  pBt->maxLocal = 
fe70: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
fe80: 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
fe90: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
fea0: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
feb0: 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
fec0: 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78  - 23;.  pBt->max
fed0: 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62  Leaf = pBt->usab
fee0: 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70  leSize - 35;.  p
fef0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70  Bt->minLeaf = (p
ff00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
ff10: 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
ff20: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
ff30: 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
ff40: 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
ff50: 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
ff60: 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65  1 = pPage1;.  re
ff70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff80: 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
ff90: 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
ffa0: 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
ffb0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
ffc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ffd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ffe0: 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b   works like lock
fff0: 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74  Btree() except t
10000 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f  hat it also invo
10010 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20  kes the.** busy 
10020 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72  callback if ther
10030 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e is lock conten
10040 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10050 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  int lockBtreeWit
10060 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52  hRetry(Btree *pR
10070 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ef){.  int rc = 
10080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
10090 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
100a0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65  eeHoldsMutex(pRe
100b0 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66  f) );.  if( pRef
100c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
100d0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20  _NONE ){.    u8 
100e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
100f0 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
10100 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74  nsaction;.    bt
10110 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
10120 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  f);.    rc = sql
10130 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
10140 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20  ans(pRef, 0);.  
10150 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54    pRef->pBt->inT
10160 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54  ransaction = inT
10170 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
10180 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  pRef->inTrans = 
10190 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
101a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
101b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d  K ){.      pRef-
101c0 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  >pBt->nTransacti
101d0 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on--;.    }.    
101e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
101f0 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ref);.  }.  retu
10200 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20  rn rc;.}.       
10210 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
10220 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
10230 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
10240 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
10250 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
10260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
10270 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
10280 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10290 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
102a0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
102b0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
102c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
102d0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
102e0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
102f0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
10300 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
10310 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
10320 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  ny outstanding c
10330 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75  ursors, this rou
10340 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
10350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
10360 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
10370 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
10380 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
10390 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
103a0 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
103b0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
103c0 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
103d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
103e0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
103f0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
10400 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
10410 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
10420 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26  t->pCursor==0 &&
10430 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
10440 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
10450 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
10460 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20  pBt->pPager)>=1 
10470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10480 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
10490 61 74 61 20 29 3b 0a 20 20 20 20 20 20 72 65 6c  ata );.      rel
104a0 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50  easePage(pBt->pP
104b0 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
104c0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
104d0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
104e0 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
104f0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
10500 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
10510 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
10520 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
10530 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
10540 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10550 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
10560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
10570 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
10580 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
10590 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
105a0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
105b0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
105c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
105d0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
105e0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
105f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10600 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
10610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10620 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
10630 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
10640 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
10650 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
10660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10670 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
10680 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
10690 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
106a0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
106b0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
106c0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
106d0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
106e0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
106f0 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
10700 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
10710 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
10720 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
10730 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
10740 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
10750 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
10760 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
10770 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
10780 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
10790 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
107a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
107b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
107c0 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
107d0 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
107e0 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
107f0 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
10800 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
10810 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
10820 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
10830 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
10840 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
10850 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
10860 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
10870 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
10880 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
10890 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
108a0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
108b0 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
108c0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
108d0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
108e0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
108f0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
10900 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
10910 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
10920 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
10930 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
10940 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
10950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10960 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  _OK;.}../*.** At
10970 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61  tempt to start a
10980 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
10990 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  . A write-transa
109a0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72  ction.** is star
109b0 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ted if the secon
109c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
109d0 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  nzero, otherwise
109e0 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e   a read-.** tran
109f0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  saction.  If the
10a00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10a10 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e   is 2 or more an
10a20 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74  d exclusive.** t
10a30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
10a40 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74  arted, meaning t
10a50 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
10a60 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a  cess is allowed.
10a70 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ** to access the
10a80 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72   database.  A pr
10a90 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61  eexisting transa
10aa0 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65  ction may not be
10ab0 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20  .** upgraded to 
10ac0 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c  exclusive by cal
10ad0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
10ae0 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20  e a second time 
10af0 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69  - the.** exclusi
10b00 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77  vity flag only w
10b10 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74  orks for a new t
10b20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
10b30 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
10b40 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74  ction must be st
10b50 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74  arted before att
10b60 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20  empting any .** 
10b70 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
10b80 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f  atabase.  None o
10b90 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
10ba0 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c  routines .** wil
10bb0 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20  l work unless a 
10bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
10bd0 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a  tarted first:.**
10be0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
10bf0 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
10c00 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
10c10 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64  e3BtreeCreateInd
10c20 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  ex().**      sql
10c30 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61  ite3BtreeClearTa
10c40 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
10c50 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61  lite3BtreeDropTa
10c60 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
10c70 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
10c80 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
10c90 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a  e3BtreeDelete().
10ca0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
10cb0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29  treeUpdateMeta()
10cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69  .**.** If an ini
10cd0 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20  tial attempt to 
10ce0 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b  acquire the lock
10cf0 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f   fails because o
10d00 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  f lock contentio
10d10 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  n.** and the dat
10d20 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f  abase was previo
10d30 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  usly unlocked, t
10d40 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  hen invoke the b
10d50 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69  usy handler.** i
10d60 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
10d70 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61   But if there wa
10d80 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72  s previously a r
10d90 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74  ead-lock, do not
10da0 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  .** invoke the b
10db0 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75  usy handler - ju
10dc0 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
10dd0 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42  _BUSY.  SQLITE_B
10de0 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  USY is .** retur
10df0 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  ned when there i
10e00 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  s already a read
10e10 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74  -lock in order t
10e20 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f  o avoid a deadlo
10e30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  ck..**.** Suppos
10e40 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  e there are two 
10e50 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20  processes A and 
10e60 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64  B.  A has a read
10e70 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a   lock and B has.
10e80 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ** a reserved lo
10e90 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20  ck.  B tries to 
10ea0 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75  promote to exclu
10eb0 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63  sive but is bloc
10ec0 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f  ked because.** o
10ed0 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e  f A's read lock.
10ee0 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f    A tries to pro
10ef0 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64  mote to reserved
10f00 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
10f10 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20  by B..** One or 
10f20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
10f30 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d   two processes m
10f40 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20  ust give way or 
10f50 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
10f60 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79  no progress.  By
10f70 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
10f80 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69  E_BUSY and not i
10f90 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79  nvoking the busy
10fa0 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65   callback.** whe
10fb0 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  n A already has 
10fc0 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20  a read lock, we 
10fd0 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67  encourage A to g
10fe0 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42  ive up and let B
10ff0 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a  .** proceed..*/.
11000 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11010 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65  BeginTrans(Btree
11020 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29   *p, int wrflag)
11030 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c  {.  sqlite3 *pBl
11040 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  ock = 0;.  BtSha
11050 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11060 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
11070 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
11080 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11090 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
110a0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
110b0 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72  the btree is alr
110c0 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d  eady in a write-
110d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20  transaction, or 
110e0 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  it.  ** is alrea
110f0 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61  dy in a read-tra
11100 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72  nsaction and a r
11110 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11120 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65    ** is requeste
11130 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  d, this is a no-
11140 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
11150 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11160 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e  _WRITE || (p->in
11170 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41  Trans==TRANS_REA
11180 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b  D && !wrflag) ){
11190 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
111a0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
111b0 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
111c0 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
111d0 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
111e0 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
111f0 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
11200 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b  nly && wrflag ){
11210 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11220 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
11230 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
11240 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
11250 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
11260 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
11270 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
11280 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
11290 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
112a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
112b0 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
112c0 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
112d0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
112e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
112f0 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
11300 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
11310 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
11320 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
11330 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
11340 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
11350 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64  ) || pBt->isPend
11360 69 6e 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63  ing ){.    pBloc
11370 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72  k = pBt->pWriter
11380 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->db;.  }else if
11390 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
113a0 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
113b0 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
113c0 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
113d0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
113e0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
113f0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
11400 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c  p ){.        pBl
11410 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
11420 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
11430 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11450 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71  pBlock ){.    sq
11460 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
11470 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
11480 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20  lock);.    rc = 
11490 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
114a0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67  AREDCACHE;.    g
114b0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
114c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64  .  }.#endif..  d
114d0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
114e0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
114f0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
11500 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
11510 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
11520 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
11530 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
11540 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
11550 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
11560 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
11570 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
11580 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
11590 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
115a0 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
115b0 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
115c0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
115d0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
115e0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
115f0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
11600 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
11610 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
11620 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
11630 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
11640 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
11650 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
11660 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
11670 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
11680 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
11690 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
116a0 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
116b0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
116c0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
116d0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
116e0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
116f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
11700 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
11710 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11730 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
11740 50 61 67 65 72 2c 20 77 72 66 6c 61 67 3e 31 29  Pager, wrflag>1)
11750 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
11760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11770 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
11780 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
11790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
117a0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
117b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
117c0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
117d0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
117e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
117f0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
11800 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
11810 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
11820 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
11830 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
11840 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
11850 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
11860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11870 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
11880 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
11890 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
118a0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
118b0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
118c0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
118d0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
118e0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
118f0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
11900 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
11910 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11920 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
11930 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
11940 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11950 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
11960 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
11970 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
11980 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
11990 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
119a0 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
119b0 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66  usive = (u8)(wrf
119c0 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65  lag>1);.    }.#e
119d0 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
119e0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
119f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
11a00 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
11a10 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
11a20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
11a30 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
11a40 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
11a50 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
11a60 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
11a70 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
11a80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
11a90 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
11aa0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
11ab0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
11ac0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
11ad0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
11ae0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11af0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
11b00 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
11b10 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
11b20 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
11b30 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
11b40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11b50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11b60 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
11b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11b80 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
11b90 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
11ba0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
11bb0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
11bc0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
11bd0 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
11be0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
11bf0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
11c00 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
11c10 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
11c20 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
11c30 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
11c40 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
11c50 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
11c60 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
11c70 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
11c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ca0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
11cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
11cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11ce0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
11cf0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
11d00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
11d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11d30 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
11d40 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
11d50 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
11d60 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
11d70 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
11d80 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
11d90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11da0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11db0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11dc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11dd0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
11de0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
11df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e00 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
11e10 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
11e20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
11e30 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
11e40 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
11e50 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
11e60 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
11e70 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
11e80 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
11e90 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
11ea0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ec0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
11ed0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
11ee0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
11ef0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
11f00 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
11f10 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
11f20 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
11f30 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
11f40 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
11f50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
11f60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11f70 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
11f80 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
11f90 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
11fa0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
11fb0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
11fc0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
11fd0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
11fe0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
11ff0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
12000 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
12010 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
12020 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
12030 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
12040 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
12050 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
12060 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
12070 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12080 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
12090 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
120a0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
120b0 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
120c0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
120d0 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
120e0 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
120f0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
12100 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
12110 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
12120 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
12130 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
12140 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
12150 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
12160 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
12170 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
12180 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
12190 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
121a0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
121b0 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
121e0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
121f0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
12200 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
12210 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
12220 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
12230 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
12240 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
12250 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
12260 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
12270 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
12280 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
12290 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
122a0 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
122b0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
122c0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
122e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
122f0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
12300 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
12310 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
12320 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
12330 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
12340 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
12350 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12360 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12370 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
12380 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12390 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
123a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
123b0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
123c0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
123d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
123e0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
123f0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
12400 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
12410 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
12420 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
12430 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
12440 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
12450 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
12460 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
12470 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
12480 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
12490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
124a0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
124b0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
124c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
124d0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
124e0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
124f0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
12500 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
12510 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
12520 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
12530 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
12540 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
12550 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
12560 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
12570 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
12580 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
12590 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
125a0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
125b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
125c0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
125d0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
125e0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
125f0 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
12600 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12610 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
12620 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
12630 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
12640 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
12650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
12660 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12670 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12690 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
126a0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
126b0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
126c0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
126d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
126e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
126f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
12700 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
12710 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
12720 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
12730 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
12740 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
12750 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
12760 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
12770 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
12780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12790 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
127a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
127b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
127c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
127d0 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
127e0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
127f0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
12800 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12810 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
12820 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
12830 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
12840 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
12850 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
12860 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
12870 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
12880 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
12890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
128a0 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
128b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
128c0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
128d0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
128e0 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
128f0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
12900 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
12910 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
12920 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
12930 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
12940 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
12950 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
12960 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12970 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
12980 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
12990 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
129a0 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
129b0 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
129c0 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
129d0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
129e0 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
129f0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
12a00 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
12a10 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
12a20 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
12a30 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
12a40 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
12a50 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
12a60 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
12a70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
12a80 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
12a90 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
12aa0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
12ab0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
12ac0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
12ad0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
12ae0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
12af0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
12b00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12b10 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
12b20 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
12b30 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
12b40 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
12b50 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
12b60 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
12b70 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
12b80 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
12b90 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
12ba0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
12bb0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
12bc0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
12bd0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
12be0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
12bf0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
12c00 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
12c10 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
12c20 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
12c30 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
12c40 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
12c50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12c60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12c70 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
12c80 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
12c90 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
12ca0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
12cb0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
12cc0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
12cd0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
12ce0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
12cf0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
12d00 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
12d10 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
12d20 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
12d30 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
12d40 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
12d50 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
12d60 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
12d70 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
12d80 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
12d90 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
12da0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
12db0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
12dc0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
12dd0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
12de0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
12df0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
12e00 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
12e10 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
12e20 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
12e30 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
12e40 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
12e50 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
12e60 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
12e70 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
12e80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
12e90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ea0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12eb0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
12ec0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
12ed0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
12ee0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
12ef0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
12f00 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
12f10 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
12f20 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
12f30 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
12f40 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
12f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12f60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
12f70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
12f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12f90 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
12fa0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
12fb0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
12fc0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
12fd0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
12fe0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
12ff0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
13000 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
13010 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
13020 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
13030 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
13040 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
13050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13060 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13070 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
13080 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
13090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
130a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
130b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
130c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
130d0 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
130e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
130f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13100 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
13110 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
13120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13130 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
13140 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
13150 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
13160 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
13170 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
13180 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
13190 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
131a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
131b0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
131c0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
131d0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
131e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
131f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
13200 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
13210 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
13220 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
13230 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
13240 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
13250 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
13260 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
13270 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
13280 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
13290 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
132a0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
132b0 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
132c0 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
132d0 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
132e0 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
132f0 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
13300 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
13310 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
13320 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
13330 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
13340 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
13350 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
13360 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
13370 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
13380 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
13390 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
133a0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
133b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
133c0 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
133d0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
133e0 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
133f0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
13400 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
13410 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
13420 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
13430 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
13440 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
13450 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
13460 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
13470 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
13480 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
13490 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
134a0 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
134b0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
134c0 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
134d0 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
134e0 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
134f0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
13500 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
13510 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
13520 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
13530 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
13540 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
13550 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13560 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
13570 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
13580 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13590 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
135a0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
135b0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
135c0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
135d0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
135e0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
135f0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
13600 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
13610 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
13620 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
13630 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
13640 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
13650 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
13660 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
13670 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
13680 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
13690 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
136a0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
136b0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
136c0 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
136d0 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
136e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
136f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
13700 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
13710 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
13720 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
13730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
13750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
13760 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
13770 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
13780 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13790 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
137a0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
137b0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
137c0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
137d0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
137e0 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
137f0 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
13800 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
13810 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
13820 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
13830 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
13840 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13850 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
13860 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
13870 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
13880 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
13890 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
138a0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
138b0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
138c0 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
138d0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
138e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
138f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
13900 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
13910 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
13920 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
13930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13940 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13950 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13960 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
13970 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
13980 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13990 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
139a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
139b0 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
139c0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
139d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
139e0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
139f0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
13a00 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
13a10 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
13a20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
13a30 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
13a40 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
13a50 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13a60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13a70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13a80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13a90 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
13aa0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
13ab0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
13ac0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
13ad0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
13ae0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
13af0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
13b00 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
13b10 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
13b20 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
13b30 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13b40 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
13b50 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13b60 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
13b70 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
13b80 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
13b90 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
13ba0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
13bb0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
13bc0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
13bd0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
13be0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
13bf0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
13c00 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
13c10 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
13c20 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
13c30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
13c40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13c50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
13c60 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
13c70 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
13c80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
13ca0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
13cb0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
13cc0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
13cd0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
13ce0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
13cf0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
13d00 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
13d10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
13d20 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
13d30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
13d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13d50 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
13d60 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
13d70 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
13d80 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
13d90 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
13da0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
13db0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
13dc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13df0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13e00 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
13e10 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
13e20 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
13e30 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
13e40 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
13e50 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
13e60 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
13e70 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
13e80 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
13e90 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
13ea0 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
13eb0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = 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 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
13ee0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
13ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
13f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13f20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
13f30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
13f40 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
13f50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
13f60 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
13f70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13f90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13fb0 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
13fc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13fd0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
13fe0 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
13ff0 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
14000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14010 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
14020 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
14030 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
14040 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
14050 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
14060 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
14070 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
14080 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
14090 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
140a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
140b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
140c0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
140d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
140e0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
140f0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
14100 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
14110 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
14120 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
14130 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
14140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14150 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
14160 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
14170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14180 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
14190 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
141a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
141b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
141c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
141d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
141e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
141f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
14200 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
14210 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
14220 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
14230 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
14240 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
14250 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
14260 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
14270 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
14280 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
14290 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
142a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
142b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
142c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
142d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
142e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
142f0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
14300 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
14310 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
14320 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
14330 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
14340 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
14350 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
14360 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
14370 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
14380 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
14390 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
143a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
143b0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
143c0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
143d0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
143e0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
143f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14400 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
14410 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
14420 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
14430 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
14440 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
14450 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
14460 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
14470 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
14480 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
14490 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
144a0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
144b0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
144c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
144d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
144e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
144f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14500 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14510 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
14520 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
14530 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
14540 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
14550 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
14560 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
14570 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20   nFin;.    Pgno 
14580 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20  nFree;.    Pgno 
14590 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e  nPtrmap;.    Pgn
145a0 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e  o iFree;.    con
145b0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
145c0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
145d0 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61   Pgno nOrig = pa
145e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
145f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d  );..    if( PTRM
14600 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
14610 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
14620 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
14630 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
14640 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
14650 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
14660 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
14670 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
14680 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
14690 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
146a0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
146b0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
146c0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
146d0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
146e0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
146f0 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
14700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
14710 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14720 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14730 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
14740 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
14750 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
14760 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
14770 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
14780 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
14790 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
147a0 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
147b0 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
147c0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
147d0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
147e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
147f0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
14800 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
14810 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
14820 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
14830 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
14840 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
14850 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
14860 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
14870 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
14880 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
14890 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
148a0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
148b0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
148c0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
148d0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
148e0 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
148f0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
14900 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
14910 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
14920 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
14930 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14950 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
14960 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
14970 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
14980 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
14990 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
149a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
149b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
149c0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
149d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
149e0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
149f0 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
14a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14a10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14a20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14a30 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14a40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14a50 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
14a60 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
14a70 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
14a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
14a90 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20 53  ndif /* ifndef S
14aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14ab0 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
14ac0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
14ad0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
14ae0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
14af0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
14b00 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
14b10 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
14b20 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
14b30 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
14b40 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
14b50 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
14b60 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
14b70 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
14b80 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
14b90 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
14ba0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
14bb0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
14bc0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
14bd0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
14be0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
14bf0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
14c00 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
14c10 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
14c20 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
14c30 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
14c40 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
14c50 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
14c60 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
14c70 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
14c80 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
14c90 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
14ca0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
14cb0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
14cc0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
14cd0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
14ce0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
14cf0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
14d00 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
14d10 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
14d20 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
14d30 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
14d40 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
14d50 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14d60 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
14d70 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
14d80 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
14d90 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
14da0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
14db0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
14dc0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
14dd0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
14de0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
14df0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
14e00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14e10 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
14e20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
14e30 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
14e40 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
14e50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
14e60 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
14e70 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
14e80 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
14e90 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
14ea0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
14eb0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
14ec0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
14ed0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
14ee0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
14ef0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
14f00 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
14f10 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
14f20 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
14f30 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
14f40 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
14f50 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
14f60 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
14f70 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
14f80 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
14f90 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
14fa0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
14fb0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
14fc0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
14fd0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
14fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14ff0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
15000 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
15010 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
15020 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
15030 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
15040 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
15050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15060 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
15070 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
15080 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
15090 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
150a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
150b0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
150c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
150d0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
150e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
150f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
15100 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
15110 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
15120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
15140 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
15150 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
15170 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
15180 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
15190 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
151a0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
151b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
151c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
151d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
151e0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
151f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
15200 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
15210 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
15220 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
15230 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
15240 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
15250 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
15260 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
15270 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
15280 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
15290 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
152a0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
152b0 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
152c0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
152d0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
152e0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
152f0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
15300 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
15310 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
15320 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
15330 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
15340 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
15350 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
15360 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
15370 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
15380 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
15390 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
153a0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
153b0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
153c0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
153d0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
153e0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
153f0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
15400 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
15410 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
15420 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
15430 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
15440 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
15450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15460 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
15470 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
15480 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
15490 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
154a0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
154b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
154c0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
154d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
154e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
154f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15500 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
15510 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
15520 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
15530 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
15540 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
15550 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
15560 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
15570 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
15580 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
15590 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
155a0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
155b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
155c0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
155d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
155e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
155f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
15600 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
15610 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
15620 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15630 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
15640 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
15650 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
15660 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15670 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15680 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
15690 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
156a0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
156b0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
156c0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
156d0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
156e0 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
156f0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
15700 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
15710 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
15720 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
15730 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
15740 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
15750 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
15760 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
15770 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
15780 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
15790 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
157a0 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
157b0 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
157c0 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
157d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
157e0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
157f0 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
15800 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
15810 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  );.    pBt->nTra
15820 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
15830 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
15840 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
15850 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
15860 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
15870 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
15880 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
15890 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
158a0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
158b0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
158c0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
158d0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
158e0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
158f0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
15900 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65  ion..  */.  btre
15910 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
15920 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72  (pBt);.  p->inTr
15930 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
15940 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
15950 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
15960 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
15970 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15980 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
159a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
159b0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
159c0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
159d0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
159e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
159f0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
15a00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
15a10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
15a20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
15a30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
15a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15a50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
15a60 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
15a70 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
15a80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15aa0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
15ab0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15ac0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
15ad0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
15ae0 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
15af0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
15b00 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
15b10 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
15b20 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
15b30 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
15b40 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
15b50 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
15b60 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
15b70 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
15b80 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
15b90 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
15ba0 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
15bb0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
15bc0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
15bd0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
15be0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
15bf0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
15c00 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
15c10 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
15c20 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
15c30 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
15c40 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
15c50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
15c60 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
15c70 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15c80 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15c90 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
15ca0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
15cb0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
15cc0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
15cd0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
15ce0 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
15cf0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
15d00 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
15d10 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
15d20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
15d30 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
15d40 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
15d50 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
15d60 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
15d70 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
15d80 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
15d90 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
15da0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
15db0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
15dc0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
15dd0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
15de0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
15df0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
15e00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
15e10 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
15e20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
15e30 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
15e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15e50 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
15e60 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
15e70 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
15e80 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
15e90 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
15ea0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
15eb0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
15ec0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
15ed0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
15ee0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
15ef0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
15f00 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
15f10 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
15f20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
15f30 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
15f40 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
15f50 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
15f60 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
15f70 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
15f80 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
15f90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15fa0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
15fb0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
15fc0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
15fd0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
15fe0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15ff0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
16000 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
16010 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
16020 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
16030 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
16040 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
16050 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
16060 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
16070 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
16080 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
16090 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
160a0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
160b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
160c0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
160d0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
160e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
160f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16100 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
16110 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
16120 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
16130 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
16140 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
16150 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
16160 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
16170 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
16180 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
16190 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
161a0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
161b0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
161c0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
161d0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
161e0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
161f0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
16200 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16210 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
16220 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
16230 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
16240 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
16250 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
16260 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16270 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
16280 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16290 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
162a0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
162b0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
162c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
162d0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
162e0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
162f0 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
16300 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16310 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
16320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16330 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
16340 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
16350 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
16360 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
16370 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
16380 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
16390 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
163a0 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
163b0 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
163c0 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
163d0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
163e0 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
163f0 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
16400 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
16410 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
16420 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
16430 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
16440 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
16450 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
16460 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
16470 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
16480 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
16490 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
164a0 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
164b0 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
164c0 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
164d0 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
164e0 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
164f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
16500 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
16510 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
16520 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
16530 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16540 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16550 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
16560 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
16570 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
16580 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
16590 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
165a0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
165b0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
165c0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
165d0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
165e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
165f0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
16600 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
16610 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
16620 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
16630 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
16640 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c  .    ** call sql
16650 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16660 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
16670 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
16680 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
16690 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
166a0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
166b0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ( sqlite3BtreeGe
166c0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
166d0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
166e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
166f0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16700 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
16710 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
16720 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
16730 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
16740 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
16750 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66  _READ;.  }..  if
16760 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
16770 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
16780 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
16790 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
167a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
167b0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
167c0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
167d0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
167e0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
167f0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
16800 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
16810 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
16820 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
16830 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
16840 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
16850 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
16860 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
16870 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
16880 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
16890 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
168a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
168b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
168c0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
168d0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
168e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
168f0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
16900 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
16910 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
16920 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
16930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
16940 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
16950 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
16960 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
16970 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
16980 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
16990 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
169a0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
169b0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
169c0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
169d0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
169e0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
169f0 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
16a00 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
16a10 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
16a20 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
16a30 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
16a40 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
16a50 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
16a60 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
16a70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
16a80 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16a90 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
16aa0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
16ab0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
16ac0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
16ad0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
16ae0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
16af0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
16b00 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
16b10 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
16b20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
16b30 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
16b40 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
16b50 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
16b60 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
16b70 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
16b80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
16b90 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
16ba0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
16bb0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
16bc0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
16bd0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
16be0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
16bf0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
16c00 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
16c10 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
16c20 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
16c30 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
16c40 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
16c50 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
16c60 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
16c70 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
16c80 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
16c90 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
16ca0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16cb0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
16cc0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
16cd0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
16ce0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
16cf0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16d00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16d10 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
16d20 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  rt( p->inTrans==
16d30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
16d40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65   assert( pBt->re
16d50 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  adOnly==0 );.  a
16d60 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
16d70 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
16d80 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
16d90 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
16da0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e  .  if( NEVER(p->
16db0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57  inTrans!=TRANS_W
16dc0 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72 65 61  RITE || pBt->rea
16dd0 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63  dOnly) ){.    rc
16de0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
16df0 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AL;.  }else{.   
16e00 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
16e10 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
16e20 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
16e30 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
16e40 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
16e50 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
16e60 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
16e70 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64  th.    ** an ind
16e80 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
16e90 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
16ea0 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
16eb0 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53  y using.    ** S
16ec0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
16ed0 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
16ee0 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
16ef0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
16f00 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
16f10 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
16f20 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
16f30 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
16f40 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f  s active..    */
16f50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16f60 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
16f70 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
16f80 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
16f90 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
16fa0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16fb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16fc0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
16fd0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
16fe0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
16ff0 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
17000 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
17010 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
17020 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
17030 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
17040 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
17050 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
17060 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
17070 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
17080 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
17090 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
170a0 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
170b0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
170c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
170d0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
170e0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
170f0 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
17100 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
17110 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
17120 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
17130 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
17140 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
17150 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
17160 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
17170 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
17180 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
17190 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
171a0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
171b0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
171c0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
171d0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
171e0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
171f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
17200 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
17210 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
17220 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
17230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17240 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
17250 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17260 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
17270 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17280 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
17290 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
172a0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
172b0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
172c0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
172d0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
172e0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
172f0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
17300 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
17310 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17320 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
17330 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
17340 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
17350 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
17360 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17380 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
17390 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pBt);.    }.  
173a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
173b0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
173c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
173d0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
173e0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
173f0 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
17400 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
17410 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
17420 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
17430 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
17440 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
17450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17460 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
17470 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
17480 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
17490 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
174a0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
174b0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
174c0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
174d0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
174e0 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
174f0 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
17500 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
17510 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
17520 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
17530 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
17540 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
17550 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
17560 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
17570 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
17580 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
17590 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
175a0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
175b0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
175c0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
175d0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
175e0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
175f0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
17600 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
17610 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
17620 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
17630 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
17640 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
17650 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
17660 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
17670 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
17680 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
17690 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
176a0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
176b0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
176c0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
176d0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
176e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
176f0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
17700 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
17710 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
17720 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
17730 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
17740 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
17750 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
17760 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
17770 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
17780 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
17790 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
177a0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
177b0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
177c0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
177d0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
177e0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
177f0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
17800 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
17810 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
17820 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
17830 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65  ursorSize() byte
17840 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  s of memory .** 
17850 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43  pointed to by pC
17860 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72  ur have been zer
17870 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  oed by the calle
17880 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
17890 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
178a0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
178b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
178d0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
178e0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
17910 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
17920 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
17950 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
17960 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
17970 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
17980 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
17990 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
179a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
179b0 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
179c0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
179f0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
17a00 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20   int rc;.  Pgno 
17a10 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  nPage;.  BtShare
17a20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17a30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17a40 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
17a50 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
17a60 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
17a70 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  wrFlag==1 );.  i
17a80 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
17a90 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
17aa0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69  eadOnly );.    i
17ab0 66 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65  f( NEVER(pBt->re
17ac0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
17ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17ae0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
17af0 20 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72     rc = checkFor
17b00 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
17b10 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a   iTable, 0, 0);.
17b20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17b30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
17b40 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
17b50 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
17b60 41 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65  ACHE );.      re
17b70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17b80 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
17b90 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
17ba0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69  rc = lockBtreeWi
17bb0 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20  thRetry(p);.    
17bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17bd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17be0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
17bf0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
17c00 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
17c10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17c20 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17c30 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20  t->pPager, (int 
17c40 2a 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66  *)&nPage); .  if
17c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
17c80 6c 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d  le==1 && nPage==
17c90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
17ca0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
17cb0 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
17cc0 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
17cd0 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
17ce0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
17cf0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
17d00 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a  ur->apPage[0]);.
17d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17d30 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
17d40 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
17d50 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
17d60 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
17d70 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
17d80 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
17d90 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
17da0 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
17db0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
17dc0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
17dd0 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
17de0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
17df0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
17e00 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
17e10 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
17e20 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
17e30 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
17e40 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
17e50 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
17e60 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
17e70 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
17e80 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
17e90 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
17ea0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
17eb0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
17ec0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
17ed0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
17ee0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
17ef0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
17f00 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
17f10 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
17f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61  SQLITE_OK;..crea
17f30 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
17f40 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  ion:.  releasePa
17f50 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
17f60 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  0]);.  unlockBtr
17f70 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
17f80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17f90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17fa0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
17fb0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
17fe0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
17ff0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18010 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
18020 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
18030 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
18040 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
18070 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
18080 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
18090 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
180b0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
180c0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
180d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
18100 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
18110 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
18120 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
18130 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
18140 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
18150 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
18160 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
18170 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18180 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
181a0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
181b0 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f   of a BtCursor o
181c0 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a  bject in bytes..
181d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72  **.** This inter
181e0 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20  faces is needed 
181f0 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66  so that users of
18200 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65   cursors can pre
18210 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66  allocate.** suff
18220 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74  icient storage t
18230 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e  o hold a cursor.
18240 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f    The BtCursor o
18250 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a  bject is opaque.
18260 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74  ** to users so t
18270 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68  hey cannot do th
18280 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73  e sizeof() thems
18290 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73  elves - they mus
182a0 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72  t call.** this r
182b0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  outine..*/.int s
182c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
182d0 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72  rSize(void){.  r
182e0 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
182f0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ursor);.}../*.**
18300 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
18310 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
18320 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
18330 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
18340 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
18350 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
18360 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
18370 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
18380 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
18390 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
183a0 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
183b0 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
183c0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
183d0 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
183e0 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
183f0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
18400 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
18410 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
18420 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
18430 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
18440 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
18450 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
18460 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
18470 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
18480 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
18490 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
184a0 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
184b0 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
184c0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
184d0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
184e0 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
184f0 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
18500 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
18510 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
18520 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
18530 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
18540 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
18550 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
18560 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
18570 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
18580 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
18590 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
185a0 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
185b0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
185c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
185d0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
185e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
185f0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
18600 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
18610 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
18620 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
18630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18640 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
18650 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
18660 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
18670 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
18680 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
18690 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
186a0 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
186b0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
186c0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
186d0 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
186e0 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
186f0 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
18700 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
18710 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
18720 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
18730 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
18740 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
18750 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
18760 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
18770 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
18780 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
18790 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
187a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
187b0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
187c0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
187d0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
187e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
187f0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
18800 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
18810 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
18820 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
18830 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
18840 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18850 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18860 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
18870 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18880 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
18890 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
188a0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
188b0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
188c0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
188d0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
188e0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
188f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
18900 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
18910 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
18920 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
18930 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
18940 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
18950 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
18960 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
18970 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
18980 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18990 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
189a0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
189b0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
189c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
189d0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
189e0 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
189f0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
18a00 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
18a10 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18a20 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
18a30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18a40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18a50 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79  Make a temporary
18a60 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69   cursor by filli
18a70 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73  ng in the fields
18a80 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a   of pTempCur..**
18a90 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63   The temporary c
18aa0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20  ursor is not on 
18ab0 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20  the cursor list 
18ac0 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a  for the Btree..*
18ad0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
18ae0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
18af0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18b00 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70   BtCursor *pTemp
18b10 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
18b20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
18b30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
18b40 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d  );.  memcpy(pTem
18b50 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65  pCur, pCur, size
18b60 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20  of(BtCursor));. 
18b70 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74   pTempCur->pNext
18b80 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72   = 0;.  pTempCur
18b90 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66  ->pPrev = 0;.  f
18ba0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70  or(i=0; i<=pTemp
18bb0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
18bc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
18bd0 65 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e  erRef(pTempCur->
18be0 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61  apPage[i]->pDbPa
18bf0 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ge);.  }.  asser
18c00 74 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65  t( pTempCur->pKe
18c10 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y==0 );.}../*.**
18c20 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
18c30 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
18c40 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
18c50 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
18c60 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
18c70 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
18c80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
18c90 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
18ca0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
18cb0 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
18cc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18cd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18ce0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
18cf0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
18d00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
18d10 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61  gerUnref(pCur->a
18d20 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
18d30 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
18d40 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
18d50 79 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  y);.}..../*.** M
18d60 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
18d70 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
18d80 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
18d90 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
18da0 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
18db0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
18dc0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
18dd0 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65  , call.** sqlite
18de0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
18df0 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
18e00 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
18e10 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
18e20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
18e30 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
18e40 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
18e50 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
18e60 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
18e70 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  f calls to sqlit
18e80 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
18e90 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
18ea0 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
18eb0 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
18ec0 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
18ed0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
18ee0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
18ef0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
18f00 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
18f10 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
18f20 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
18f30 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
18f40 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
18f50 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
18f60 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
18f70 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
18f80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
18f90 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
18fa0 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
18fb0 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
18fc0 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
18fd0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
18fe0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
18ff0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
19000 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
19010 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
19020 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
19030 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
19040 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
19050 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
19060 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
19070 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
19080 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
19090 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
190a0 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
190b0 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
190c0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
190d0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
190e0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
190f0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
19100 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
19110 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
19120 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
19130 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
19140 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
19150 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
19160 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
19170 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
19180 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
19190 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
191a0 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
191b0 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
191c0 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
191d0 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
191e0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
191f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
19200 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
19210 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
19220 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
19230 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
19240 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19250 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
19260 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
19270 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
19280 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
19290 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
192a0 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
192b0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
192c0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
192d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
192e0 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
192f0 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
19300 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
19310 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
19320 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
19330 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
19340 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
19350 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
19360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19390 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
193a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
193f0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33     \.    sqlite3
19440 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
19450 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
19460 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
19470 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
19480 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e  o); \.    pCur->
19490 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65        \.    asse
19530 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
19540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e         \.  }.#en
19580 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20  dif /* _MSC_VER 
19590 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
195a0 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
195b0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
195c0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
195d0 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
195e0 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
195f0 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
19600 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
19610 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
19620 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
19630 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
19640 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
19650 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
19660 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
19670 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
19680 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
19690 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
196a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
196b0 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f  s in the key..*/
196c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
196d0 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
196e0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
196f0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ize){.  int rc;.
19700 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19710 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19720 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
19730 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
19740 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
19750 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19760 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
19770 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19780 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
19790 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
197a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66  _VALID );.    if
197b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
197c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
197d0 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  {.      *pSize =
197e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
197f0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
19800 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
19810 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
19820 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  o.nKey;.    }.  
19830 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19840 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
19850 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
19860 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
19870 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
19880 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
19890 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
198a0 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
198b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
198c0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
198d0 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20  ssible.  If the 
198e0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75  cursor is not cu
198f0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
19900 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  ing to an entry 
19910 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65  (which can happe
19920 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
19930 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  if.** the databa
19940 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65  se is empty) the
19950 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  n *pSize is set 
19960 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  to 0..*/.int sql
19970 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
19980 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
19990 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
199a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
199b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
199c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
199d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
199e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
199f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19a10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19a20 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
19a30 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
19a40 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19a50 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
19a60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19a70 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
19a80 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
19a90 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
19aa0 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
19ab0 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
19ac0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
19ad0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
19ae0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
19af0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
19b00 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
19b10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19b20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
19b30 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
19b40 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
19b50 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
19b60 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
19b70 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
19b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
19b90 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
19ba0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
19bb0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
19bc0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
19bd0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
19be0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
19bf0 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
19c00 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
19c10 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
19c20 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
19c30 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
19c40 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
19c50 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
19c60 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
19c70 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
19c80 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
19c90 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
19ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
19cb0 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
19cc0 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
19cd0 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
19ce0 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
19cf0 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
19d00 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
19d10 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
19d20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
19d30 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
19d40 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
19d50 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
19d60 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
19d70 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
19d80 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
19d90 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
19da0 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
19db0 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
19dc0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
19dd0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
19de0 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
19df0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
19e00 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
19e10 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
19e20 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
19e30 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
19e40 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
19e50 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
19e60 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
19e70 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
19e80 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
19e90 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
19ea0 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
19eb0 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
19ec0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
19ed0 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
19ee0 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
19ef0 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
19f00 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
19f10 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
19f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
19f30 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
19f40 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
19f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19f60 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
19f70 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
19f80 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
19f90 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
19fa0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
19fb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
19fc0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
19fd0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
19fe0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
19ff0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1a000 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1a010 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1a020 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1a030 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1a040 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1a050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a060 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1a070 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1a080 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1a090 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1a0a0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1a0b0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1a0c0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1a0d0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1a0e0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1a0f0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1a100 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1a110 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1a120 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1a130 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1a140 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1a150 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1a160 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1a170 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1a180 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1a190 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1a1a0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1a1b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1a1c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1a1d0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1a1e0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1a1f0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1a200 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1a210 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1a220 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1a230 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a240 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1a250 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1a260 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1a270 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1a280 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1a290 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1a2a0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1a2b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a2c0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1a2d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1a2e0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1a2f0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1a300 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1a310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1a320 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1a330 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1a340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a350 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a360 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1a370 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1a380 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1a390 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1a3a0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1a3b0 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1a3c0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1a3d0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1a3e0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1a3f0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1a400 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1a410 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1a420 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1a430 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1a440 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1a450 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1a460 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1a470 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1a480 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1a490 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1a4a0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1a4b0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1a4c0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1a4d0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1a4e0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1a4f0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1a500 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1a510 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1a520 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1a530 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1a540 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1a550 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1a560 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1a570 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1a580 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1a590 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1a5a0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1a5b0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1a5c0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1a5d0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1a5e0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1a5f0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1a600 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1a610 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1a620 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1a630 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1a640 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1a650 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1a660 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1a670 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1a680 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1a690 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1a6a0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1a6b0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1a6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a6d0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1a6e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a700 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1a710 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1a720 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1a730 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1a740 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1a750 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1a760 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1a770 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1a780 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1a790 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1a7a0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1a7b0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1a7c0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1a7d0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1a7e0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1a7f0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1a800 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1a810 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1a820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a830 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a840 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1a850 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1a860 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1a870 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1a880 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1a890 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1a8a0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1a8b0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1a8c0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1a8d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1a8e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1a8f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a900 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1a910 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1a920 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1a930 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1a940 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1a950 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1a960 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1a970 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1a980 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1a990 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1a9a0 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1a9b0 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1a9c0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1a9d0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1a9e0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1a9f0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1aa00 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1aa10 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1aa20 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1aa30 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1aa40 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1aa50 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1aa60 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1aa70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1aa80 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1aa90 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1aaa0 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1aab0 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1aac0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1aad0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1aae0 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1aaf0 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1ab00 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1ab10 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1ab20 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1ab30 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1ab40 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1ab50 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1ab60 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1ab70 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1ab80 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1ab90 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1aba0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1abb0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1abc0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1abd0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1abe0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1abf0 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1ac00 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1ac10 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1ac20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1ac30 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1ac40 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1ac50 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1ac60 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1ac70 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1ac80 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1ac90 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1aca0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1acb0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1acc0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1acd0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1ace0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1acf0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1ad00 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1ad10 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1ad20 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1ad30 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1ad40 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1ad50 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1ad60 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1ad70 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1ad80 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1ad90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1ada0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1adb0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1adc0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1add0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1ade0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1adf0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1ae00 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1ae10 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1ae20 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1ae30 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1ae40 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1ae50 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1ae60 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1ae70 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1ae80 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1ae90 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1aea0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1aeb0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1aec0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1aed0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1aee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1aef0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1af00 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1af10 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1af20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1af30 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1af40 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1af50 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1af60 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1af70 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1af80 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1af90 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1afa0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1afb0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1afc0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1afd0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1afe0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1aff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1b000 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1b010 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1b020 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1b030 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b040 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1b050 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1b060 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1b070 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1b080 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1b090 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1b0a0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1b0b0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1b0c0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1b0d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b0e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b0f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1b100 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1b110 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1b120 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1b130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1b150 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1b160 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1b170 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1b180 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1b190 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1b1a0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1b1b0 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1b1c0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1b1d0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1b1e0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1b1f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1b200 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1b210 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1b220 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1b230 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1b240 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1b250 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1b260 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1b270 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1b280 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1b290 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1b2a0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1b2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b2c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b2d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1b2e0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1b2f0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1b300 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1b310 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1b320 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1b330 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1b340 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1b350 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1b360 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1b370 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1b380 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1b390 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1b3a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1b3b0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1b3c0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1b3d0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1b3e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1b3f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1b400 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1b410 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1b420 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1b430 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1b440 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1b450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1b460 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1b470 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1b480 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1b490 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1b4a0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1b4b0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1b4c0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1b4d0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1b4e0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1b4f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1b500 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1b510 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1b520 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1b530 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1b540 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1b550 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1b560 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1b570 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1b580 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1b590 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1b5a0 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1b5b0 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1b5c0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1b5d0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1b5e0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1b5f0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1b600 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1b610 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1b620 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1b630 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1b640 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1b650 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1b660 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1b670 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1b680 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1b690 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1b6a0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1b6b0 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1b6c0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1b6d0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1b6e0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1b6f0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1b700 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1b710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1b720 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1b730 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1b740 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1b750 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1b760 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1b770 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1b780 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1b790 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1b7a0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1b7b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b7c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1b7d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1b7e0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1b7f0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1b800 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1b810 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1b820 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1b830 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1b840 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1b850 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1b860 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1b870 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1b880 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1b890 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1b8a0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1b8b0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1b8c0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1b8d0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1b8e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1b8f0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1b900 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1b910 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1b920 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1b930 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1b940 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1b950 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1b960 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b970 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1b980 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1b990 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1b9a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1b9b0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1b9c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1b9d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1b9e0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1b9f0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1ba00 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1ba10 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1ba20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1ba30 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1ba40 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1ba50 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1ba60 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1ba70 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1ba80 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1ba90 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1baa0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1bab0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1bac0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1bad0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1bae0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1baf0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1bb00 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1bb10 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1bb20 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1bb30 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1bb40 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1bb50 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1bb60 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1bb70 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1bb80 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1bb90 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1bba0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1bbb0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1bbc0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1bbd0 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1bbe0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1bbf0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bc00 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1bc10 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1bc20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1bc30 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1bc40 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1bc50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bc60 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1bc70 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1bc80 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1bc90 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1bca0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1bcb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1bcc0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1bcd0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1bce0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1bcf0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1bd00 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1bd10 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1bd20 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1bd30 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1bd40 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1bd50 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1bd60 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1bd70 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1bd80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bd90 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1bda0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1bdb0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1bdc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1bdd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bde0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1bdf0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1be00 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1be10 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1be20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1be30 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1be40 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1be50 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1be60 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1be70 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1be80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1be90 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1bea0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1beb0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1bec0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1bed0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1bee0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1bef0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1bf00 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1bf10 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1bf20 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1bf30 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1bf40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bf50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1bf60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1bf70 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1bf80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1bf90 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1bfa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bfb0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1bfc0 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1bfd0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1bfe0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1bff0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1c000 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1c010 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1c020 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1c030 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1c040 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1c050 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1c060 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1c070 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1c080 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1c090 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1c0a0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1c0b0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1c0c0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1c0d0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1c0e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c0f0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1c100 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1c110 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1c120 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1c130 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c140 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c150 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1c160 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1c170 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1c180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c190 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c1a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c1b0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1c1c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1c1d0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1c1e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c1f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1c200 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1c210 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1c220 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c230 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1c240 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1c250 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c260 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1c270 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1c280 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1c290 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1c2a0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1c2b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1c2c0 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1c2d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c2e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1c2f0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1c300 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1c310 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1c320 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1c330 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1c340 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1c350 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1c360 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1c370 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1c380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1c390 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1c3a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1c3b0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1c3c0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1c3d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1c3e0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1c3f0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1c400 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1c410 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1c420 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1c430 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c440 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1c450 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1c460 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1c470 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1c480 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1c490 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c4a0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1c4b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c4c0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1c4d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1c4e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c4f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1c500 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1c510 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1c520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c530 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c540 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c550 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1c560 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1c570 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1c580 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1c590 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1c5a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1c5b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1c5c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c5d0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1c5e0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1c5f0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1c600 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1c610 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1c620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c630 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c640 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1c650 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1c660 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1c670 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1c680 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1c690 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1c6a0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1c6b0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1c6c0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1c6d0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1c6e0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1c6f0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1c700 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1c710 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1c720 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1c730 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1c740 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1c750 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1c760 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1c770 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1c780 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1c790 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1c7a0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1c7b0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1c7c0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1c7d0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1c7e0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1c7f0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1c800 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1c810 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1c820 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1c830 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1c840 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1c850 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1c860 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1c870 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1c880 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1c890 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1c8a0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1c8b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1c8c0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1c8d0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1c8e0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1c8f0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1c900 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1c910 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1c920 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1c930 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1c940 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1c950 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1c960 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1c970 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1c980 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1c990 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1c9a0 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1c9b0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1c9c0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1c9d0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1c9e0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1c9f0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1ca00 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1ca10 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1ca20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1ca30 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1ca40 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1ca50 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1ca60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1ca70 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1ca80 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1ca90 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1caa0 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1cab0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1cac0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1cad0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1cae0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1caf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cb00 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1cb10 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1cb20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1cb30 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1cb40 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1cb50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1cb60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cb70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1cb80 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1cb90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1cba0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1cbb0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1cbc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1cbd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1cbe0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1cbf0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1cc00 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1cc10 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1cc20 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1cc30 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1cc40 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1cc50 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1cc60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1cc70 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1cc80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1cc90 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1cca0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1ccb0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1ccc0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1ccd0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1cce0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1ccf0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1cd00 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1cd10 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1cd20 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1cd30 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1cd40 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1cd50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1cd60 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1cd70 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1cd80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1cd90 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1cda0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1cdb0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1cdc0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1cdd0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1cde0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1cdf0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1ce00 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1ce10 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1ce20 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1ce30 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1ce40 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1ce50 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1ce60 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1ce70 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1ce80 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1ce90 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1cea0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1ceb0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1cec0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1ced0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1cee0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1cef0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1cf00 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1cf10 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1cf20 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1cf30 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1cf40 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1cf50 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1cf60 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1cf70 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1cf80 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1cf90 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1cfa0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1cfb0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1cfc0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1cfd0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1cfe0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1cff0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1d000 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
1d010 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1d020 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
1d030 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d040 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1d050 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
1d060 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
1d070 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
1d080 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1d090 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
1d0a0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
1d0b0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1d0c0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1d0d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d0e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d0f0 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
1d100 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1d110 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1d120 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
1d130 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1d140 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
1d150 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1d160 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1d170 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1d180 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
1d190 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
1d1a0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
1d1b0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1d1c0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
1d1d0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
1d1e0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1d1f0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
1d200 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
1d210 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
1d220 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
1d230 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
1d240 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
1d250 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1d260 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1d270 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d280 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1d290 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d2a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d2b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1d2c0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
1d2d0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
1d2e0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1d2f0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
1d300 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
1d310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d320 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1d330 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
1d340 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
1d350 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
1d360 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
1d370 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
1d380 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
1d390 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
1d3a0 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
1d3b0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
1d3c0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1d3d0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1d3e0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1d3f0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
1d400 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72  nCell<1 ){.    r
1d410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d420 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1d430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d440 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  K;.}..#ifndef ND
1d450 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
1d460 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
1d470 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
1d480 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
1d490 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
1d4a0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
1d4b0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
1d4c0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
1d4d0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
1d4e0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
1d4f0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
1d500 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
1d510 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
1d520 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
1d530 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
1d540 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
1d550 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
1d560 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
1d570 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1d580 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
1d590 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
1d5a0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
1d5b0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
1d5c0 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
1d5d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1d5e0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
1d5f0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
1d600 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d610 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
1d620 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
1d630 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
1d640 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
1d650 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
1d660 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1d670 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
1d680 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
1d690 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
1d6a0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
1d6b0 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
1d6c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1d6d0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
1d6e0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
1d6f0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
1d700 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
1d710 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
1d720 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
1d730 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
1d740 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1d750 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
1d760 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
1d770 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
1d780 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
1d790 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
1d7a0 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
1d7b0 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
1d7c0 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  ll index..*/.voi
1d7d0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  d sqlite3BtreeMo
1d7e0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
1d7f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1d800 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d810 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d820 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d830 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1d840 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1d850 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
1d860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d870 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d880 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
1d890 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
1d8a0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
1d8b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1d8c0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
1d8d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1d8e0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
1d8f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1d900 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c  >pgno.  );.  rel
1d910 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1d920 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d930 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
1d940 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
1d950 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d960 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1d970 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
1d980 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
1d990 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a   the root page.*
1d9a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1d9b0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
1d9c0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
1d9d0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
1d9e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d9f0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
1da00 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
1da10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1da20 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1da30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1da40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1da50 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
1da60 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
1da70 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1da80 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
1da90 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
1daa0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1dab0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
1dac0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
1dad0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1dae0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1daf0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
1db00 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
1db10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1db20 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
1db30 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
1db40 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20  >skip;.    }.   
1db50 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1db60 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1db70 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
1db80 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
1db90 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1dba0 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=1; i<=pCur->iP
1dbb0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1dbc0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1dbd0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1dbe0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1dbf0 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
1dc00 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
1dc10 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
1dc20 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
1dc30 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
1dc40 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  0])).    ){.    
1dc50 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1dc60 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1dc70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1dc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
1dc90 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
1dca0 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
1dcb0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
1dcc0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
1dcd0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
1dce0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   0;.  pCur->aiId
1dcf0 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
1dd00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1dd10 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
1dd20 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1dd30 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
1dd40 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
1dd50 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
1dd60 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1dd70 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73  subpage;.    ass
1dd80 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
1dd90 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61  ==1 );.    subpa
1dda0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
1ddb0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
1ddc0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
1ddd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75  ;.    assert( su
1dde0 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70  bpage>0 );.    p
1ddf0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1de00 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
1de10 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1de20 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
1de30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
1de40 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1de50 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
1de60 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1de70 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
1de80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1de90 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1dea0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1deb0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
1dec0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1ded0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
1dee0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1def0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
1df00 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
1df10 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
1df20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
1df30 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
1df40 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
1df50 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
1df60 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1df70 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
1df80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
1df90 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
1dfa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1dfb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1dfc0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1dfd0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1dfe0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1dff0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e000 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1e010 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1e020 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1e030 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e040 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
1e050 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1e060 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1e070 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1e080 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
1e090 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
1e0a0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1e0b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e0c0 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
1e0d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1e0e0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1e0f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e100 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1e110 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1e120 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1e130 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1e140 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1e150 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1e160 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1e170 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1e180 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1e190 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1e1a0 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1e1b0 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1e1c0 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1e1d0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1e1e0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1e1f0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1e200 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1e210 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1e220 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1e230 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1e240 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1e250 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1e260 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1e270 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1e280 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1e290 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1e2a0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1e2b0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1e2c0 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1e2d0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1e2e0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1e2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1e300 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1e310 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1e320 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e330 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e340 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e350 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e360 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1e370 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1e380 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1e390 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1e3a0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1e3b0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1e3c0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1e3d0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1e3e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1e3f0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1e400 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
1e410 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1e420 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1e430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
1e450 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e460 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
1e470 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
1e480 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1e490 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1e4a0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
1e4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e4c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1e4d0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
1e4e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1e4f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1e500 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1e510 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1e520 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1e530 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1e540 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1e550 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1e560 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1e570 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1e580 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
1e590 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1e5a0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1e5b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e5c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1e5d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1e5e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e5f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1e600 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1e610 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1e620 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1e630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e640 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1e650 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e660 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1e670 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1e680 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1e690 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
1e6a0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1e6b0 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
1e6c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e6d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1e6e0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e6f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e700 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  Cell>0 );.      
1e710 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
1e720 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1e730 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1e740 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1e750 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1e760 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1e770 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
1e780 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
1e790 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
1e7a0 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
1e7b0 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
1e7c0 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
1e7d0 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
1e7e0 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
1e7f0 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
1e800 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1e810 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e820 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f  treeLast(BtCurso
1e830 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1e840 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1e850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e870 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e880 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e890 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1e8a0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1e8b0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1e8c0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1e8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e8e0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1e8f0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1e900 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
1e910 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1e920 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e930 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1e940 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1e950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1e960 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e970 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e980 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1e990 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1e9a0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
1e9b0 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72  Cur);.      pCur
1e9c0 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53  ->atLast = rc==S
1e9d0 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20  QLITE_OK ?1:0;. 
1e9e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e9f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1ea00 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
1ea10 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1ea20 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
1ea30 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
1ea40 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
1ea50 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
1ea60 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1ea70 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1ea80 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
1ea90 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
1eaa0 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
1eab0 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
1eac0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
1ead0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
1eae0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
1eaf0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
1eb00 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1eb10 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1eb20 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1eb30 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1eb40 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1eb50 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1eb60 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1eb70 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1eb80 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1eb90 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1eba0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1ebb0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1ebc0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1ebd0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1ebe0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
1ebf0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1ec00 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
1ec10 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
1ec20 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
1ec30 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
1ec40 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
1ec50 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
1ec60 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
1ec70 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
1ec80 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
1ec90 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
1eca0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1ecb0 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1ecc0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1ecd0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1ece0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1ed10 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
1ed20 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
1ed30 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
1ed50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
1ed60 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
1ed70 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
1ed80 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
1ed90 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
1eda0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1edb0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1edc0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1edd0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
1ede0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
1edf0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
1ee00 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1ee10 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1ee20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1ee30 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ee50 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
1ee60 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
1ee70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ee80 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1ee90 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
1eea0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
1eeb0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1eec0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
1eed0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1eee0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
1eef0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1ef00 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
1ef10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ef20 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
1ef30 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
1ef40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1ef50 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1ef60 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1ef70 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1ef80 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1ef90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1efa0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1efb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1efc0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1efd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1efe0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1eff0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f000 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1f010 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1f020 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1f030 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1f040 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1f050 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1f060 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1f070 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1f080 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1f090 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1f0a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f0b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f0c0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1f0d0 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
1f0e0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1f0f0 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
1f100 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f110 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1f120 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f140 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
1f150 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
1f160 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
1f170 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1f180 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1f190 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f1a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1f1b0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1f1c0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1f1d0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1f1e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1f1f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1f200 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1f210 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f220 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f230 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
1f240 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f250 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1f260 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1f270 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1f280 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1f290 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1f2a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1f2b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f2c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1f2d0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1f2e0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
1f2f0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
1f300 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1f310 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1f320 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1f330 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1f340 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1f350 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
1f360 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
1f370 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
1f380 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
1f390 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
1f3a0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
1f3b0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
1f3c0 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  (!pPage->intKey 
1f3d0 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20 7c  && pIdxKey==0) |
1f3e0 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20 20  | upr<0 ){.     
1f3f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f400 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f410 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1f420 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ish;.    }.    i
1f430 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
1f440 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1f450 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1f460 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d   (u16)upr;.    }
1f470 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1f480 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f490 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70  age] = (u16)((up
1f4a0 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+lwr)/2);.    }
1f4b0 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
1f4c0 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b      void *pCellK
1f4d0 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43  ey;.      i64 nC
1f4e0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  ellKey;.      in
1f4f0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
1f500 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f510 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1f520 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1f530 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1f540 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1f550 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1f560 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1f570 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1f580 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1f590 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
1f5a0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
1f5b0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1f5c0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1f5d0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
1f5e0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1f5f0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
1f600 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
1f610 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1f620 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1f630 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
1f640 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1f650 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
1f660 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1f670 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
1f680 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
1f690 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
1f6a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1f6b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f6c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f6d0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
1f6e0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1f6f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1f700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1f710 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1f720 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1f730 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1f740 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1f750 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1f760 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1f770 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1f780 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1f790 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1f7a0 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1f7b0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1f7c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f7d0 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20  ((int)nCellKey, 
1f7e0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1f7f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
1f800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  e{.          pCe
1f810 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
1f820 61 6c 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65 6c  alloc( (int)nCel
1f830 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  lKey );.        
1f840 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
1f850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1f860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1f870 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
1f880 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1f890 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
1f8a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f8b0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1f8c0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
1f8d0 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70 43  llKey, (void*)pC
1f8e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1f8f0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
1f900 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f910 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 70  (int)nCellKey, p
1f920 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
1f930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1f940 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
1f950 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1f960 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1f970 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1f980 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f990 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
1f9a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
1f9b0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
1f9c0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
1f9d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1f9e0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1f9f0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
1fa00 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
1fa10 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20  upr = lwr - 1;. 
1fa20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1fa30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1fa40 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
1fa50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1fa60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1fa70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1fa80 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1fa90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1faa0 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1fab0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
1fac0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1fad0 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
1fae0 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1faf0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1fb00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1fb10 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1fb20 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62  llKey;.        b
1fb30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1fb40 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1fb50 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1fb60 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
1fb70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1fb80 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1fb90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fba0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1fbb0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1fbc0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1fbd0 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1fbe0 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1fbf0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1fc00 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1fc10 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1fc20 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1fc30 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1fc40 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1fc50 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1fc60 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1fc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1fc80 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1fc90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1fca0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1fcb0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1fcc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1fcd0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
1fce0 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1fcf0 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
1fd00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1fd10 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1fd20 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
1fd30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1fd40 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
1fd50 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
1fd60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1fd70 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1fd80 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
1fd90 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1fda0 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
1fdb0 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1fdc0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
1fdd0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
1fde0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fdf0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
1fe00 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
1fe10 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
1fe20 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
1fe30 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
1fe40 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
1fe50 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1fe60 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
1fe70 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
1fe80 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
1fe90 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
1fea0 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
1feb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fec0 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
1fed0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1fee0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
1fef0 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
1ff00 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
1ff10 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1ff20 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
1ff30 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
1ff40 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
1ff50 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1ff60 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
1ff70 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
1ff80 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
1ff90 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
1ffa0 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
1ffb0 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
1ffc0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1ffd0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1ffe0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
1fff0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
20000 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
20010 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20030 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
20040 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20050 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
20060 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
20070 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
20080 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
20090 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
200a0 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
200b0 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
200c0 2f 0a 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  /...  if( pKey )
200d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
200e0 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
200f0 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
20100 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  y = sqlite3VdbeR
20110 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
20120 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
20130 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20  )nKey, pKey,.   
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
20170 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
20180 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
20190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
201a0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
201b0 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
201c0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
201d0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
201e0 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
201f0 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
20200 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b   pRes);.  if( pK
20210 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
20220 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
20230 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65  kedRecord(pIdxKe
20240 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
20250 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
20260 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20270 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
20280 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
20290 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
202a0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
202b0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
202c0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
202d0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
202e0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
202f0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
20300 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
20310 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
20320 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
20330 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
20340 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
20350 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
20360 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
20370 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20380 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
20390 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
203a0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
203b0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
203c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
203d0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
203e0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
203f0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
20400 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
20410 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
20420 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
20430 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
20440 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
20450 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
20460 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
20470 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
20480 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
20490 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
204a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
204b0 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73  andle for a curs
204c0 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  or..*/.sqlite3 *
204d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
204e0 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72  orDb(const BtCur
204f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
20500 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
20510 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
20520 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
20530 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ) );.  return pC
20540 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  ur->pBtree->db;.
20550 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
20560 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
20570 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
20580 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
20590 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
205a0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
205b0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
205c0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
205d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
205e0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
205f0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
20600 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
20610 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
20620 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
20630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20640 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
20650 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
20660 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
20670 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
20680 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
20690 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
206a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
206b0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
206c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
206d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
206e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
206f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
20700 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
20710 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
20720 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
20730 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
20740 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
20750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20760 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
20770 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  kip>0 ){.    pCu
20780 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
20790 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
207a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
207b0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
207c0 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
207d0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
207e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
207f0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
20800 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20820 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
20830 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67  ssert( idx<=pPag
20840 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
20850 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20860 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
20870 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
20880 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
20890 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
208a0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
208b0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
208c0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
208d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
208e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
208f0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
20900 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20910 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
20920 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
20930 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
20940 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
20950 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
20960 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
20970 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
20980 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
20990 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
209a0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
209b0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
209c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
209d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
209e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
209f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
20a00 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
20a10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20a20 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
20a30 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
20a40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20a50 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
20a60 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
20a70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
20a80 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
20a90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20aa0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
20ab0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20ad0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
20ae0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
20af0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
20b00 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
20b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b20 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
20b30 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
20b40 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
20b50 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
20b60 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
20b70 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
20b80 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
20b90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
20ba0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
20bb0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
20bc0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
20bd0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
20be0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
20bf0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
20c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
20c10 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
20c20 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
20c30 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
20c40 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
20c50 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
20c60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
20c70 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
20c80 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
20c90 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
20ca0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20cb0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
20cc0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
20cd0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
20ce0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
20d00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
20d10 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
20d20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
20d30 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
20d40 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
20d50 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
20d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20d70 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
20d80 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
20d90 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
20da0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
20db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20dc0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
20dd0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
20de0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20df0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
20e00 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
20e10 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
20e20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
20e30 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
20e40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
20e50 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
20e60 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
20e70 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
20e80 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
20e90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20eb0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
20ec0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
20ed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
20ee0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
20ef0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
20f00 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
20f10 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
20f20 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
20f30 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
20f40 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
20f50 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
20f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20f70 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
20f80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
20f90 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
20fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
20fb0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20fc0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20fd0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
20fe0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20ff0 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
21000 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
21010 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21020 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
21030 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
21040 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
21050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
21060 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
21070 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
21080 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
210a0 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
210b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
210c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
210d0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
210e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
210f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
21100 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
21110 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
21120 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
21130 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
21140 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
21150 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
21160 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
21170 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
21180 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
21190 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
211a0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
211b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
211c0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
211d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
211e0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
211f0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
21200 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
21210 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
21220 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
21230 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
21240 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
21250 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
21260 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
21270 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
21280 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
21290 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
212a0 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
212b0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
212c0 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
212d0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
212e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
212f0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
21300 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
21310 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
21320 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
21330 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
21340 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
21350 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
21360 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
21370 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
21380 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
21390 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
213a0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
213b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
213c0 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
213d0 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
213e0 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
213f0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
21400 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
21410 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
21420 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
21430 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
21440 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
21450 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
21460 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
21470 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
21480 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
21490 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
214a0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
214b0 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
214c0 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
214d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
214e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
214f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21500 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
21510 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
21520 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
21530 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
21540 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
21550 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
21560 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f  ;.  int n;     /
21570 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
21580 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
21590 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20  t */.  int k;   
215a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
215b0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
215c0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
215d0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
215e0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
215f0 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
21600 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  nk = 0;..  asser
21610 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
21620 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
21630 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
21640 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
21650 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
21660 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
21670 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
21680 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
21690 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
216a0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
216b0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
216c0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
216d0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
216e0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
216f0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
21700 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
21710 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
21720 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
21730 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
21740 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
21750 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
21760 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
21770 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
21780 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
21790 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
217a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
217b0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
217c0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
217d0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
217e0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
217f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
21800 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
21810 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
21820 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65   && nearby<=page
21830 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
21840 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
21850 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
21860 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
21870 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21880 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
21890 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
218a0 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
218b0 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
218c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
218d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
218e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
218f0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
21900 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
21910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21920 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
21930 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21940 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
21950 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
21960 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
21970 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
21980 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
21990 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
219a0 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
219b0 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
219c0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
219d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
219e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
219f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
21a00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
21a10 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
21a20 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
21a30 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
21a40 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
21a50 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
21a60 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
21a70 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
21a80 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
21a90 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
21aa0 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
21ab0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
21ac0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
21ad0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
21ae0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
21af0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
21b00 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
21b10 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
21b20 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
21b30 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
21b40 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
21b50 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
21b60 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
21b70 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
21b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21b90 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
21ba0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
21bb0 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
21bc0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21bd0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
21be0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
21bf0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
21c00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
21c10 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
21c20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21c30 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21c40 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
21c50 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
21c60 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
21c70 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
21c80 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
21c90 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
21ca0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
21cb0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
21cc0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
21cd0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
21ce0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
21cf0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
21d00 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
21d10 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
21d20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
21d30 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
21d40 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
21d50 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
21d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21d70 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
21d80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21d90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21da0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21db0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
21dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
21dd0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
21de0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
21df0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
21e00 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
21e10 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
21e20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
21e30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
21e40 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
21e50 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
21e60 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
21e70 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
21e80 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
21e90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
21ea0 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
21eb0 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
21ec0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
21ed0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
21ee0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
21ef0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
21f00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21f10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21f20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
21f30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
21f40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21f50 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21f60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
21f70 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
21f80 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
21f90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
21fa0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
21fb0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
21fc0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
21fd0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
21fe0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
21ff0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
22000 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
22010 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
22020 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
22030 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
22040 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
22050 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
22060 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
22070 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
22080 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22090 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
220a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
220b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
220c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
220d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
220e0 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
220f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22100 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
22110 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
22120 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
22130 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
22140 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
22150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22160 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
22170 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
22180 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
22190 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
221a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
221b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
221c0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
221d0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
221e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
221f0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
22200 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
22210 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
22220 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
22230 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
22240 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
22250 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
22260 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
22270 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22280 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
22290 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
222a0 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
222b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
222c0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
222d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
222e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
222f0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
22300 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
22310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22330 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
22340 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
22350 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
22360 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22370 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
22380 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
22390 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
223a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
223b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
223c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
223d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
223e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
223f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
22400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22410 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
22420 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
22430 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
22440 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
22450 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
22460 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
22470 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
22480 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
22490 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
224a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
224b0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
224c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
224d0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
224e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
224f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
22500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
22510 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22520 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
22530 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
22540 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22550 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
22560 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
22570 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
22580 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
225a0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
225b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
225c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
225e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
225f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
22600 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22610 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
22620 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
22630 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
22640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22650 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
22660 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
22670 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
22680 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
22690 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
226a0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
226b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
226c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
226d0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
226e0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
226f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
22700 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
22710 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
22720 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
22730 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
22740 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
22750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22760 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
22770 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
22780 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
22790 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
227a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
227b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
227c0 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
227d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
227e0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
227f0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
22800 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
22810 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
22820 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
22830 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
22840 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
22850 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
22860 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
22870 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
22880 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
22890 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
228a0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
228b0 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
228c0 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
228d0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
228e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
228f0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
22900 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
22910 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
22920 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
22930 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
22940 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
22950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
22960 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
22970 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
22980 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
22990 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
229a0 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
229b0 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
229c0 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
229d0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
229e0 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
229f0 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
22a00 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
22a10 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
22a20 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
22a30 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
22a40 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
22a50 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
22a60 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
22a70 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
22a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22aa0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
22ab0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
22ac0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
22ad0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
22ae0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
22af0 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
22b00 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
22b10 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
22b20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
22b30 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
22b50 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
22b60 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
22b70 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
22b80 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
22b90 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
22ba0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
22bb0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
22bc0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
22bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22be0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
22bf0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
22c00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22c10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
22c20 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
22c30 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
22c40 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
22c50 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
22c60 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
22c70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
22c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
22c90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
22ca0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
22cb0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
22cc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22cd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22ce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22cf0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
22d00 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
22d10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
22d20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22d40 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
22d50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
22d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22d70 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
22d80 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
22d90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22da0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22db0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
22dc0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
22dd0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
22de0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
22df0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
22e00 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
22e10 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
22e20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
22e30 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
22e40 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
22e50 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
22e60 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
22e70 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
22e80 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
22e90 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
22ea0 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
22eb0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
22ec0 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
22ed0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
22ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22ef0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
22f00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
22f10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
22f20 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
22f30 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
22f40 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
22f50 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
22f60 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
22f70 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
22f80 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
22f90 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
22fa0 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
22fb0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
22fc0 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
22fd0 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
22fe0 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
22ff0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
23000 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
23010 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
23020 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
23030 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
23040 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
23050 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
23060 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
23070 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
23080 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
23090 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
230a0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
230b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
230c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
230d0 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
230e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
230f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23110 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
23120 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
23130 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
23140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23150 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
23160 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
23170 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
23180 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
23190 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
231a0 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
231b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
231c0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
231d0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
231e0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
231f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
23200 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
23210 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
23220 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
23230 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
23240 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
23250 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
23260 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
23270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23280 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
23290 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
232a0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
232b0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
232c0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
232d0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
232e0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
232f0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
23300 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
23310 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
23320 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
23330 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
23340 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
23350 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
23360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23370 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
23380 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
23390 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
233a0 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
233b0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
233c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
233d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
233e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
233f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
23400 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
23410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23420 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
23430 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
23440 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
23450 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
23460 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
23470 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
23480 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
23490 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
234a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
234b0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
234c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
234d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
234e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
234f0 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
23500 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
23510 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
23520 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
23530 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
23540 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
23550 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
23560 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
23570 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
23580 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
23590 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
235a0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
235b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
235c0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
235d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
235e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
235f0 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
23600 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
23610 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
23620 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
23630 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
23640 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
23650 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
23660 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
23670 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
23680 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23690 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
236a0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
236b0 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
236c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
236d0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
236e0 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
236f0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
23700 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23710 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
23720 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
23730 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
23740 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
23750 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23770 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
23780 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
23790 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
237a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
237c0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
237d0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
23800 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
23810 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
23820 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23830 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
23840 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
23850 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
23860 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
23870 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
23880 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
23890 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
238a0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
238b0 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
238c0 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
238d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
238e0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
238f0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
23900 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
23910 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
23920 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
23930 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
23940 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
23950 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
23960 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
23970 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
23980 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
23990 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
239a0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
239b0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
239c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
239d0 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
239e0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
239f0 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
23a00 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
23a10 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
23a20 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
23a30 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
23a40 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
23a50 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
23a60 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
23a70 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
23a80 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
23a90 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
23aa0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
23ab0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
23ac0 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20  ))).   ||       
23ad0 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74       (rc = sqlit
23ae0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
23af0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
23b00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
23b10 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
23b20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
23b30 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
23b40 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
23b50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
23b60 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
23b70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
23b80 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
23b90 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
23ba0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
23bb0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
23bc0 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
23bd0 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
23be0 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
23bf0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
23c00 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
23c10 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
23c20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
23c30 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
23c40 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
23c50 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
23c60 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
23c70 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
23c80 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
23c90 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
23ca0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
23cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
23cc0 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
23cd0 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
23ce0 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
23cf0 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
23d00 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
23d10 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
23d20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
23d30 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
23d40 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
23d50 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
23d60 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
23d70 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
23d80 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
23d90 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
23da0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
23db0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
23dc0 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
23dd0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
23de0 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
23df0 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ree!=0 ){.    in
23e00 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
23e10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
23e20 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
23e30 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
23e40 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
23e50 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
23e60 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
23e70 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  2]);.    rc = sq
23e80 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23e90 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
23ea0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
23eb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23ec0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
23ed0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23ee0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
23ef0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
23f00 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
23f10 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b    if( nLeaf<0 ){
23f20 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23f30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23f40 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
23f50 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
23f60 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
23f70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
23f80 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
23f90 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
23fa0 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
23fb0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
23fc0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
23fd0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
23fe0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
23ff0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
24000 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
24010 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
24020 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
24030 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
24040 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
24050 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
24060 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
24070 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
24080 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
24090 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
240a0 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
240b0 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
240c0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
240d0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
240e0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
240f0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
24100 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
24110 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
24120 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
24130 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
24140 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
24150 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
24160 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
24170 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
24180 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
24190 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
241a0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
241b0 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
241c0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
241d0 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
241e0 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
241f0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
24200 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
24210 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
24220 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
24230 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
24240 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
24250 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
24260 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
24270 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
24280 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
24290 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
242a0 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
242b0 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
242c0 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
242d0 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
242e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
242f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24300 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
24310 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24320 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24330 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
24340 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
24350 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
24360 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
24370 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
24380 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69  f*4], iPage);.#i
24390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
243a0 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
243b0 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
243c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
243d0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
243e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
243f0 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
24400 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  f.        rc = b
24410 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
24420 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
24430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
24440 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
24450 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
24460 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
24470 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
24480 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
24490 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
244a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
244b0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
244c0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
244d0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
244e0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
244f0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
24500 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
24510 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
24520 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
24530 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
24540 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
24550 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
24560 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
24570 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
24580 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
24590 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
245a0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
245b0 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
245c0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
245d0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
245e0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
245f0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
24600 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
24610 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28  ..  */.  if(   (
24620 28 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21  (!pPage) && (0 !
24630 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  = (rc = sqlite3B
24640 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
24650 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
24660 30 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30  0)))).     || (0
24670 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
24680 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
24690 65 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20  e->pDbPage))).  
246a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
246b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
246c0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
246d0 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
246e0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
246f0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
24700 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
24710 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24720 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
24730 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
24740 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
24750 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
24760 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
24770 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
24780 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
24790 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
247a0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
247b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
247c0 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
247d0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
247e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
247f0 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
24800 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
24810 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61  .  return freePa
24820 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
24830 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
24840 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  no);.}../*.** Fr
24850 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
24860 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
24870 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
24880 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
24890 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
248a0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
248b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
248c0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
248d0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
248e0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
248f0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
24900 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
24910 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
24920 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
24930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24940 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
24950 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
24960 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
24970 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
24980 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
24990 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
249a0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
249b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
249c0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
249d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
249e0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
249f0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
24a00 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
24a10 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
24a20 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
24a30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
24a40 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
24a50 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
24a60 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
24a70 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
24a80 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
24a90 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
24aa0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
24ab0 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
24ac0 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
24ad0 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
24ae0 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
24af0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
24b00 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
24b10 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
24b20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
24b30 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
24b40 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
24b50 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
24b60 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
24b70 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
24b80 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
24b90 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
24ba0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
24bb0 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
24bc0 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
24bd0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
24be0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
24bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
24c00 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
24c10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24c20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24c30 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
24c40 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
24c50 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
24c60 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
24c70 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
24c80 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
24c90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
24ca0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72     }.    rc = fr
24cb0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
24cc0 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
24cd0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
24ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24cf0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
24d00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
24d10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
24d20 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
24d30 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
24d40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24d50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
24d60 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
24d70 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
24d80 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
24d90 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
24da0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
24db0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
24dc0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
24dd0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
24de0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
24df0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
24e00 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
24e10 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
24e20 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
24e30 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
24e40 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
24e50 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
24e60 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
24e70 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
24e80 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
24e90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
24ea0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
24eb0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
24ec0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
24ed0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
24ee0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
24ef0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
24f00 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
24f10 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
24f20 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
24f30 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
24f40 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
24f50 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
24f60 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
24f70 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
24f80 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
24f90 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
24fa0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
24fb0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
24fc0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
24fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
24fe0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
24ff0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
25000 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
25010 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
25020 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
25030 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
25040 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
25050 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
25060 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
25070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
25080 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
25090 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
250a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
250b0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
250c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
250d0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
250e0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
250f0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
25100 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
25110 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
25120 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
25130 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
25140 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
25150 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
25160 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
25170 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
25180 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
25190 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
251a0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
251b0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
251c0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
251d0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
251e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
251f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25200 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
25210 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
25220 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
25230 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
25240 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
25250 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
25260 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
25270 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
25280 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
25290 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
252a0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
252b0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
252c0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
252d0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
252e0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
252f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25300 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25310 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
25320 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
25330 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
25340 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
25350 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25360 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
25370 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
25380 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
25390 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
253a0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
253b0 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
253c0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
253d0 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
253e0 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
253f0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
25400 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
25410 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
25420 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
25430 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
25440 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
25450 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
25460 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
25470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
25480 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
25490 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
254a0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
254b0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
254c0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
254d0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
254e0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
254f0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
25500 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
25510 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
25520 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
25530 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
25540 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
25550 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  f( nKey>0x7fffff
25560 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b  ff || pKey==0 ){
25570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25580 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
25590 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
255a0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
255b0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
255c0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
255d0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
255e0 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
255f0 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
25600 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
25610 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
25620 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
25630 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
25640 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
25650 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
25660 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
25670 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
25680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25690 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
256a0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
256b0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
256c0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
256d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
256e0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
256f0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
25700 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
25710 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
25720 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
25730 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
25740 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
25750 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
25760 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
25770 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25780 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
25790 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
257a0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
257b0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
257c0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
257d0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
257e0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
257f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25800 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
25810 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
25820 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
25830 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
25840 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
25850 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
25860 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
25870 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
25880 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
25890 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
258a0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
258b0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
258c0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
258d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
258e0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
258f0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
25900 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
25910 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
25920 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
25930 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
25940 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
25950 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
25960 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
25970 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
25980 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
25990 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
259a0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
259b0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
259c0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
259d0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
259e0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
259f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25a00 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
25a10 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
25a20 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
25a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25a40 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
25a50 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
25a60 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
25a70 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
25a80 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
25a90 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
25aa0 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
25ab0 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  trmap);.        
25ac0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25ad0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25ae0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
25af0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
25b00 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
25b10 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
25b20 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
25b30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25b40 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
25b50 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
25b60 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
25b70 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
25b80 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
25b90 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
25ba0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
25bb0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
25bc0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
25bd0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
25be0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
25bf0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
25c00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
25c10 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
25c20 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
25c30 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
25c40 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
25c50 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
25c60 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
25c70 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
25c80 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
25c90 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
25ca0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
25cb0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
25cc0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
25cd0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
25cf0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25d00 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
25d10 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
25d20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
25d30 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
25d40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25d50 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
25d60 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
25d70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
25d80 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
25d90 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
25da0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
25db0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
25dc0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
25dd0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
25de0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25df0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
25e00 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
25e10 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
25e20 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
25e30 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
25e40 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
25e50 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
25e60 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
25e70 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
25e80 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
25e90 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
25ea0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
25eb0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
25ec0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
25ed0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
25ee0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
25ef0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
25f00 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
25f10 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
25f20 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
25f30 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
25f40 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
25f50 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
25f60 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
25f70 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
25f80 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
25f90 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
25fa0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
25fb0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
25fc0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
25fd0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
25fe0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
25ff0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
26000 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
26010 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
26020 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
26030 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
26040 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
26050 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
26060 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
26070 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
26080 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
26090 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
260a0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
260b0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
260c0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
260d0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
260e0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
260f0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
26100 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
26110 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
26120 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
26130 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
26140 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
26150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26160 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
26170 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
26180 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
26190 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
261a0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
261b0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
261c0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
261d0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
261e0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
261f0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
26200 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
26210 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
26220 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
26230 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
26240 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
26250 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
26260 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
26270 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
26280 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
26290 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
262a0 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43  static int dropC
262b0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
262c0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
262d0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
262e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
262f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
26300 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
26310 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
26320 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
26330 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
26340 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
26350 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
26360 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
26370 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
26380 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
26390 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
263a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
263b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
263c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
263d0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
263e0 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
263f0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
26400 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
26410 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
26420 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
26430 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
26440 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
26450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26460 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
26470 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
26480 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
26490 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
264a0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
264b0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
264c0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
264d0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28  byte(ptr);.  if(
264e0 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f   (pc<pPage->hdrO
264f0 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e  ffset+6+(pPage->
26500 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20  leaf?0:4)).     
26510 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d  || (pc+sz>pPage-
26520 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
26530 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26540 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26550 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
26560 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
26570 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
26580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26590 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
265a0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b    }.  for(i=idx+
265b0 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
265c0 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
265d0 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
265e0 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
265f0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
26600 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
26610 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
26620 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
26630 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
26640 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
26650 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74  Free += 2;.  ret
26660 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26670 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
26680 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
26690 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
266a0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
266b0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
266c0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
266d0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
266e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
266f0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
26700 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
26710 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
26720 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
26730 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
26740 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
26750 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
26760 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
26770 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
26780 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
26790 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
267a0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
267b0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
267c0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
267d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
267e0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
267f0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
26800 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
26810 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
26820 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
26830 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
26840 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
26850 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
26860 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
26870 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
26880 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
26890 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
268a0 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
268b0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
268c0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
268d0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
268e0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
268f0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
26900 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
26910 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
26920 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
26930 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
26940 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
26950 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
26960 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
26970 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
26980 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
26990 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
269a0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
269b0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
269c0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
269d0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
269e0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
269f0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
26a00 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
26a10 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
26a20 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
26a30 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
26a40 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
26a50 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
26a60 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
26a70 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
26a80 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
26a90 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
26aa0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
26ab0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
26ac0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
26ad0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
26ae0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
26af0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
26b00 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
26b10 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
26b20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
26b30 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
26b40 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
26b50 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
26b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26b70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
26b80 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
26b90 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
26ba0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
26bb0 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
26bc0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
26bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
26be0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
26bf0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
26c00 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
26c10 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
26c20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
26c30 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
26c40 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
26c50 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
26c60 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
26c70 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
26c80 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
26c90 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
26ca0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
26cb0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
26cc0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
26cd0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
26ce0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
26cf0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
26d00 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
26d10 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
26d20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
26d30 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
26d40 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
26d50 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
26d60 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
26d70 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
26d80 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
26d90 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
26da0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
26db0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
26dc0 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
26dd0 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
26de0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26df0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
26e00 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f  aySize(pPage->aO
26e10 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
26e20 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
26e30 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
26e40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26e50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
26e60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
26e70 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
26e80 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
26e90 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
26ea0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
26eb0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
26ec0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
26ed0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
26ee0 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
26ef0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
26f00 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
26f10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
26f20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
26f30 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
26f40 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
26f50 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
26f60 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
26f70 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
26f80 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
26f90 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
26fa0 20 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61   (u16)i;.    pPa
26fb0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ge->nFree = 0;. 
26fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
26fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26fe0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26ff0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
27000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
27030 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
27040 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
27050 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
27060 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
27070 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
27080 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
27090 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
270a0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
270b0 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
270c0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
270d0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
270e0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
270f0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
27100 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
27110 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
27120 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
27130 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
27140 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
27150 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
27160 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27170 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27190 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
271a0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
271b0 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
271c0 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
271d0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
271e0 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
271f0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
27200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
27210 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
27220 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
27230 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
27240 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
27250 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
27260 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
27270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27280 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27290 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
272a0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
272b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
272c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
272d0 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
272e0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
272f0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
27300 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
27310 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
27320 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
27330 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
27340 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
27350 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
27360 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
27370 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
27380 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
27390 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
273a0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
273b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
273c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
273d0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
273e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
273f0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
27400 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
27410 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
27420 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
27430 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
27440 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
27450 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
27460 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
27470 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
27480 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
27490 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  o;.      sqlite3
274a0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
274b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
274c0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73  &info);.      as
274d0 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
274e0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
274f0 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
27500 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
27510 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
27520 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
27530 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
27540 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
27550 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
27560 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  low]);.        r
27570 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50  c = ptrmapPut(pP
27580 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76  age->pBt, pgnoOv
27590 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
275a0 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
275b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
275c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
275d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
275e0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
275f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
27600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27610 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
27620 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
27630 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
27640 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
27650 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
27660 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
27670 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
27680 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
27690 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
276a0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
276b0 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
276c0 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
276d0 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
276e0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
276f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
27700 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
27710 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
27720 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
27730 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
27740 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
27750 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
27760 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
27770 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
27780 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
27790 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
277a0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
277b0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
277c0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
277d0 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
277e0 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
277f0 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
27800 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
27810 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
27820 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
27830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
27840 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
27850 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
27860 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
27870 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
27880 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
27890 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
278a0 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
278b0 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
278c0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
278d0 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
278e0 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
278f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
27900 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
27910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27920 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27930 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
27940 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27950 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
27960 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
27970 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
27980 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
27990 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
279a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
279b0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
279c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
279d0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
279e0 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
279f0 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
27a00 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
27a10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
27a20 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
27a30 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
27a40 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
27a50 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
27a60 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
27a70 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43  >cellOffset + nC
27a80 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
27a90 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
27aa0 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
27ab0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
27ac0 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
27ad0 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53    cellbody -= aS
27ae0 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ize[i];.    put2
27af0 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
27b00 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
27b10 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
27b20 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
27b30 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a   aSize[i]);.  }.
27b40 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
27b50 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
27b60 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
27b70 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
27b80 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
27b90 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
27ba0 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
27bb0 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
27bc0 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
27bd0 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
27be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
27bf0 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
27c00 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
27c10 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
27c20 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
27c30 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
27c40 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
27c50 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
27c60 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
27c70 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
27c80 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
27c90 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
27ca0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
27cb0 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
27cc0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
27cd0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
27ce0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
27cf0 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
27d00 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
27d10 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
27d20 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
27d30 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
27d40 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
27d50 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
27d60 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
27d70 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
27d80 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
27d90 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
27da0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
27db0 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
27dc0 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
27dd0 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
27de0 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
27df0 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
27e00 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
27e10 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
27e20 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
27e30 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
27e40 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
27e50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27e60 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
27e70 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
27e80 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
27e90 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
27ea0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
27eb0 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
27ec0 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f  alance */../* Fo
27ed0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
27ee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
27ef0 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 2a 2c  lance(BtCursor*,
27f00 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
27f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
27f20 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
27f30 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
27f40 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
27f50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
27f60 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
27f70 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
27f80 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
27f90 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
27fa0 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
27fb0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
27fc0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
27fd0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
27fe0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
27ff0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
28000 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
28010 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
28020 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
28030 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
28040 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
28050 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
28060 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
28070 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
28080 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
28090 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
280a0 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
280b0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
280c0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
280d0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
280e0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
280f0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
28100 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
28110 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
28120 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
28130 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
28140 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
28150 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
28160 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
28170 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
28180 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
28190 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
281a0 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
281b0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
281c0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
281d0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
281e0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
281f0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
28200 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
28210 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
28220 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
28230 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
28240 6e 63 65 5f 71 75 69 63 6b 28 42 74 43 75 72 73  nce_quick(BtCurs
28250 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
28260 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
28270 70 4e 65 77 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  pNew = 0;.  Pgno
28280 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a   pgnoNew;.  u8 *
28290 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43  pCell;.  u16 szC
282a0 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ell;.  CellInfo 
282b0 69 6e 66 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20  info;.  MemPage 
282c0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
282d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
282e0 65 5d 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e];.  MemPage *p
282f0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
28300 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28310 65 2d 31 5d 3b 0a 20 20 42 74 53 68 61 72 65 64  e-1];.  BtShared
28320 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
28330 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74  Bt;.  int parent
28340 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Idx = pParent->n
28350 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65  Cell;   /* pPare
28360 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  nt new divider c
28370 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
28380 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20  nt parentSize;  
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20   /* Size of new 
283b0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
283c0 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b    u8 parentCell[
283d0 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  64];            
283e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
283f0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
28400 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   cell */..  asse
28410 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28420 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
28430 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
28440 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
28450 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74  w page. Insert t
28460 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
28470 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a   from pPage.  **
28480 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72   into it. Then r
28490 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c  emove the overfl
284a0 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  ow cell from pPa
284b0 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
284c0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
284d0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
284e0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  gnoNew, 0, 0);. 
284f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28500 4f 4b 20 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  OK ){.    pCell 
28510 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
28520 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 73 7a 43  ].pCell;.    szC
28530 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
28540 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
28550 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
28560 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28570 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
28580 67 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  ge) );.    zeroP
28590 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
285a0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
285b0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
285c0 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
285d0 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  zCell);.    pPag
285e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
285f0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 70 50 61 67  ;.  .    /* pPag
28600 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  e is currently t
28610 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
28620 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e 67  f pParent. Chang
28630 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 6f  e this.    ** so
28640 20 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d   that the right-
28650 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77  child is the new
28660 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20   page allocated 
28670 61 62 6f 76 65 20 61 6e 64 0a 20 20 20 20 2a 2a  above and.    **
28680 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
28690 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
286a0 64 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d. .    **.    *
286b0 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74  * Ignore the ret
286c0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
286d0 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43   call to fillInC
286e0 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c  ell(). fillInCel
286f0 6c 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6f  l().    ** may o
28700 6e 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72  nly return other
28710 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
28720 69 66 20 69 74 20 69 73 20 72 65 71 75 69 72 65  if it is require
28730 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  d to allocate.  
28740 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
28750 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
28760 20 53 69 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e   Since an intern
28770 61 6c 20 74 61 62 6c 65 20 42 2d 54 72 65 65 20  al table B-Tree 
28780 63 65 6c 6c 20 0a 20 20 20 20 2a 2a 20 6d 61 79  cell .    ** may
28790 20 6e 65 76 65 72 20 73 70 69 6c 6c 20 6f 76 65   never spill ove
287a0 72 20 6f 6e 74 6f 20 61 6e 20 6f 76 65 72 66 6c  r onto an overfl
287b0 6f 77 20 70 61 67 65 20 28 69 74 20 69 73 20 61  ow page (it is a
287c0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 0a 20 20 20   maximum of .   
287d0 20 2a 2a 20 31 33 20 62 79 74 65 73 20 69 6e 20   ** 13 bytes in 
287e0 73 69 7a 65 29 2c 20 69 74 20 69 73 20 6e 6f 74  size), it is not
287f0 20 6e 65 63 63 65 73 73 61 72 79 20 74 6f 20 63   neccessary to c
28800 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
28810 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  code..    **.   
28820 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74   ** Similarly, t
28830 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
28840 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
28850 66 61 69 6c 20 69 66 20 74 68 65 20 70 61 67 65  fail if the page
28860 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 69 6e  .    ** being in
28870 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73 20 61  serted into is a
28880 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c 65 20  lready writable 
28890 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64 6f 65  and the cell doe
288a0 73 20 6e 6f 74 20 0a 20 20 20 20 2a 2a 20 63 6f  s not .    ** co
288b0 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f  ntain an overflo
288c0 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67  w pointer. So ig
288d0 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72 6e  nore this return
288e0 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 20 20 2a   code too..    *
288f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
28900 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
28910 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
28920 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
28930 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
28940 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
28950 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
28960 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
28970 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70      fillInCell(p
28980 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43 65  Parent, parentCe
28990 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
289a0 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72 65  , 0, 0, 0, &pare
289b0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73  ntSize);.    ass
289c0 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c  ert( parentSize<
289d0 36 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  64 );.    assert
289e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
289f0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
28a00 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
28a10 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
28a20 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
28a30 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
28a40 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
28a50 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
28a60 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
28a70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78  Parent,parentIdx
28a80 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  ), pPage->pgno);
28a90 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
28aa0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
28ab0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
28ac0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
28ad0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
28ae0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
28af0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
28b00 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
28b10 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  map.    ** with 
28b20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
28b30 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e  new page, and an
28b40 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  y pointer from t
28b50 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  he .    ** cell 
28b60 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
28b70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
28b80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
28b90 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
28ba0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28bb0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
28bc0 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
28bd0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
28be0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28c00 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
28c10 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
28c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
28c30 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
28c40 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
28c50 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
28c60 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
28c70 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pNew);.  }..  /
28c80 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
28c90 74 68 65 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  the pPage->nFree
28ca0 20 76 61 72 69 61 62 6c 65 20 69 73 20 6e 6f 74   variable is not
28cb0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 20 77   set correctly w
28cc0 69 74 68 0a 20 20 2a 2a 20 72 65 73 70 65 63 74  ith.  ** respect
28cd0 20 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   to the content 
28ce0 6f 66 20 74 68 65 20 70 61 67 65 20 28 62 65 63  of the page (bec
28cf0 61 75 73 65 20 69 74 20 77 61 73 20 73 65 74 20  ause it was set 
28d00 74 6f 20 30 20 62 79 20 0a 20 20 2a 2a 20 69 6e  to 0 by .  ** in
28d10 73 65 72 74 43 65 6c 6c 29 2e 20 53 6f 20 63 61  sertCell). So ca
28d20 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ll sqlite3BtreeI
28d30 6e 69 74 50 61 67 65 28 29 20 74 6f 20 6d 61 6b  nitPage() to mak
28d40 65 20 73 75 72 65 20 69 74 20 69 73 0a 20 20 2a  e sure it is.  *
28d50 2a 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 0a  * correct..  **.
28d60 20 20 2a 2a 20 54 68 69 73 20 68 61 73 20 74 6f    ** This has to
28d70 20 62 65 20 64 6f 6e 65 20 65 76 65 6e 20 69 66   be done even if
28d80 20 61 6e 20 65 72 72 6f 72 20 77 69 6c 6c 20 62   an error will b
28d90 65 20 72 65 74 75 72 6e 65 64 2e 20 4e 6f 72 6d  e returned. Norm
28da0 61 6c 6c 79 2c 20 69 66 0a 20 20 2a 2a 20 61 6e  ally, if.  ** an
28db0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
28dc0 72 69 6e 67 20 74 72 65 65 20 62 61 6c 61 6e 63  ring tree balanc
28dd0 69 6e 67 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ing, the content
28de0 73 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65  s of MemPage are
28df0 0a 20 20 2a 2a 20 6e 6f 74 20 69 6d 70 6f 72 74  .  ** not import
28e00 61 6e 74 2c 20 61 73 20 74 68 65 79 20 77 69 6c  ant, as they wil
28e10 6c 20 62 65 20 72 65 63 61 6c 63 75 6c 61 74 65  l be recalculate
28e20 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  d when the page 
28e30 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
28e40 61 63 6b 2e 20 42 75 74 20 68 65 72 65 2c 20 69  ack. But here, i
28e50 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  n balance_quick(
28e60 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ), it is possibl
28e70 65 20 74 68 61 74 20 70 50 61 67 65 20 68 61 73  e that pPage has
28e80 20 0a 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62   .  ** not yet b
28e90 65 65 6e 20 6d 61 72 6b 65 64 20 64 69 72 74 79  een marked dirty
28ea0 20 6f 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   or written into
28eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28ec0 65 2e 20 54 68 65 72 65 66 6f 72 65 0a 20 20 2a  e. Therefore.  *
28ed0 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  * it will not be
28ee0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
28ef0 20 73 6f 20 69 74 20 69 73 20 69 6d 70 6f 72 74   so it is import
28f00 61 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ant to make sure
28f10 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 70   that.  ** the p
28f20 61 67 65 20 64 61 74 61 20 61 6e 64 20 63 6f 6e  age data and con
28f30 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67 65  tents of MemPage
28f40 20 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 2e   are consistent.
28f50 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 69  .  */.  pPage->i
28f60 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  sInit = 0;.  sql
28f70 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
28f80 65 28 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65  e(pPage);.  asse
28f90 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
28fa0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  flow==0 );..  /*
28fb0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 65   If everything e
28fc0 6c 73 65 20 73 75 63 63 65 65 64 65 64 2c 20 62  lse succeeded, b
28fd0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
28fe0 74 20 70 61 67 65 2c 20 69 6e 20 0a 20 20 2a 2a  t page, in .  **
28ff0 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
29000 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
29010 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
29020 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
29030 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
29040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
29050 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
29060 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  ;.    pCur->iPag
29070 65 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 62 61  e--;.    rc = ba
29080 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
29090 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
290a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
290b0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
290c0 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
290d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
290e0 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
290f0 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
29100 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
29110 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
29120 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
29130 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
29140 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
29150 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
29160 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
29170 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
29180 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
29190 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
291a0 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
291b0 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
291c0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
291d0 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
291e0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
291f0 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
29200 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
29210 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
29220 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
29230 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
29240 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
29250 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
29260 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
29270 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
29280 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
29290 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
292a0 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
292b0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
292c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
292d0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
292e0 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
292f0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
29300 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
29310 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
29320 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
29330 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
29340 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
29350 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
29360 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
29370 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
29380 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
29390 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
293a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
293b0 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
293c0 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
293d0 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
293e0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
293f0 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
29400 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
29410 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
29420 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
29430 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
29440 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
29450 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
29460 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
29470 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
29480 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
29490 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
294a0 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
294b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
294c0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
294d0 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
294e0 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
294f0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
29500 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
29510 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
29520 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
29530 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
29540 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
29550 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
29560 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
29570 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
29580 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
29590 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
295a0 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
295b0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
295c0 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
295d0 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
295e0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
295f0 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
29600 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
29610 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
29620 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
29630 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
29640 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
29650 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
29660 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
29670 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
29680 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
29690 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
296a0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
296b0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
296c0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
296d0 6e 6f 6e 72 6f 6f 74 28 42 74 43 75 72 73 6f 72  nonroot(BtCursor
296e0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
296f0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
29700 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
29710 76 65 72 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ver or underfull
29720 20 70 61 67 65 20 74 6f 20 62 61 6c 61 6e 63 65   page to balance
29730 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
29740 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
29750 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
29760 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
29770 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
29780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29790 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
297a0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
297b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
297c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
297d0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
297e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
297f0 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
29800 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
29810 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
29820 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
29830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 20 3d   */.  int nOld =
29840 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29850 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
29860 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
29870 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
29880 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29890 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
298a0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
298b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
298e0 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
298f0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
29900 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
29910 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29920 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
29930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29940 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
29950 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
29960 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
29970 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
29980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29990 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
299a0 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
299b0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
299c0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
299d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
299e0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
299f0 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
29a00 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
29a10 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
29a20 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
29a30 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
29a40 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
29a50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
29a60 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
29a70 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
29a80 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
29a90 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
29aa0 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
29ab0 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
29ac0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
29ad0 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
29ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
29af0 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
29b00 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
29b10 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
29b20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
29b30 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
29b40 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
29b50 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
29b60 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
29b70 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
29b80 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
29b90 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e1[] */.  int iS
29ba0 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20  pace2 = 0;      
29bb0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
29bc0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
29bd0 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e  Space2[] */.  in
29be0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
29bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
29c00 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
29c10 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
29c20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
29c30 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
29c40 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
29c50 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
29c60 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f   */.  Pgno pgnoO
29c70 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
29c80 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29c90 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  rs for each page
29ca0 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
29cb0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
29cc0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
29cd0 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
29ce0 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
29cf0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
29d00 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
29d10 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
29d20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
29d30 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
29d40 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
29d50 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
29d60 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
29d70 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
29d80 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  e in apNew[] */.
29d90 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b    u8 *apDiv[NB];
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29db0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
29dc0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
29dd0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
29de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29df0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
29e00 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
29e10 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
29e20 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
29e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29e40 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
29e50 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
29e60 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
29e70 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
29e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
29e90 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
29ea0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
29eb0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
29ec0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
29ed0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
29ee0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
29ef0 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42  /.  u8 *aCopy[NB
29f00 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ];         /* Sp
29f10 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
29f20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
29f30 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
29f40 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
29f50 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
29f60 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
29f70 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63  ls before balanc
29f80 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  e */.  u8 *aSpac
29f90 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  e2 = 0;       /*
29fa0 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66   Space for overf
29fb0 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65 6c  low dividers cel
29fc0 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65  ls after balance
29fd0 20 2a 2f 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20   */.  u8 *aFrom 
29fe0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
29ff0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a000 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2a010 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a020 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2a030 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2a040 56 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e  VVA_ONLY( pCur->
2a050 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
2a060 31 20 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  1 );..  /* .  **
2a070 20 46 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   Find the parent
2a080 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2a090 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2a0a0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
2a0b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2a0c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a0d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2a0e0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2a0f0 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  ge) || pPage->nO
2a100 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
2a110 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2a120 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 43  ;.  pParent = pC
2a130 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a140 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73  >iPage-1];.  ass
2a150 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
2a160 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
2a170 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
2a180 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
2a190 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
2a1a0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2a1b0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20  cleanup;.  }..  
2a1c0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2a1d0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2a1e0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2a1f0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2a200 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
2a210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a220 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
2a230 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
2a240 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
2a250 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
2a260 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
2a270 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
2a280 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
2a290 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
2a2a0 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
2a2b0 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
2a2c0 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
2a2d0 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
2a2e0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2a2f0 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
2a300 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
2a310 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
2a320 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
2a330 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
2a340 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
2a350 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
2a360 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
2a370 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
2a380 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
2a390 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
2a3a0 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
2a3b0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
2a3c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
2a3d0 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
2a3e0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
2a3f0 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
2a400 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
2a410 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
2a420 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
2a430 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
2a440 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
2a450 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
2a460 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2a470 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2a480 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
2a490 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  gno.  ){.    ass
2a4a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2a4b0 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20  ey );.    /*.   
2a4c0 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
2a4d0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
2a4e0 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
2a4f0 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
2a500 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
2a510 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
2a520 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
2a530 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
2a540 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
2a550 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b 0a 20  e_quick(pCur);. 
2a560 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a570 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2a580 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a590 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2a5a0 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ge)) ){.    goto
2a5b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2a5c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
2a5d0 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
2a5e0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
2a5f0 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
2a600 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
2a610 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
2a620 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
2a630 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
2a640 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
2a650 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
2a660 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
2a670 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
2a680 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
2a690 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
2a6a0 2a 2f 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d  */.  idx = pCur-
2a6b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a6c0 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 50  ge-1];.  assertP
2a6d0 61 72 65 6e 74 49 6e 64 65 78 28 70 50 61 72 65  arentIndex(pPare
2a6e0 6e 74 2c 20 69 64 78 2c 20 70 50 61 67 65 2d 3e  nt, idx, pPage->
2a6f0 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
2a700 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70  * Find sibling p
2a710 61 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e  ages to pPage an
2a720 64 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  d the cells in p
2a730 50 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69  Parent that divi
2a740 64 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c  de.  ** the sibl
2a750 69 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70  ings.  An attemp
2a760 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
2a770 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
2a780 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64   either.  ** sid
2a790 65 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72  e of pPage.  Mor
2a7a0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
2a7b0 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
2a7c0 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a  de, however, if.
2a7d0 20 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65    ** pPage there
2a7e0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
2a7f0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
2a800 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20  he other side.  
2a810 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
2a820 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
2a830 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
2a840 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
2a850 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
2a860 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20  .  */.  nxDiv = 
2a870 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20  idx - NN;.  if( 
2a880 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61  nxDiv + NB > pPa
2a890 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2a8a0 20 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65     nxDiv = pPare
2a8b0 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b  nt->nCell - NB +
2a8c0 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78   1;.  }.  if( nx
2a8d0 44 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44  Div<0 ){.    nxD
2a8e0 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44  iv = 0;.  }.  nD
2a8f0 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  iv = 0;.  for(i=
2a900 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42  0, k=nxDiv; i<NB
2a910 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20  ; i++, k++){.   
2a920 20 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e   if( k<pParent->
2a930 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61  nCell ){.      a
2a940 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2a950 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a  ll(pParent, k);.
2a960 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20        nDiv++;.  
2a970 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2a980 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  rent->leaf );.  
2a990 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
2a9a0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2a9b0 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  i]);.    }else i
2a9c0 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  f( k==pParent->n
2a9d0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67  Cell ){.      pg
2a9e0 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
2a9f0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2aa00 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2aa10 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2aa20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65  }else{.      bre
2aa30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
2aa40 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2aa50 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69  e(pBt, pgnoOld[i
2aa60 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  ], &apOld[i]);. 
2aa70 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2aa80 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2aa90 3b 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69  ;.    /* apOld[i
2aaa0 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b  ]->idxParent = k
2aab0 3b 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b  ; */.    apCopy[
2aac0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
2aad0 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
2aae0 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
2aaf0 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
2ab00 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
2ab10 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
2ab20 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
2ab30 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2ab40 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2ab50 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2ab60 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2ab70 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2ab80 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2ab90 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2aba0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2abb0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2abc0 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2abd0 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
2abe0 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
2abf0 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
2ac20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
2ac30 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
2ac60 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69      + (ROUND8(si
2ac70 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70  zeof(MemPage))+p
2ac80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42  Bt->pageSize)*NB
2ac90 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
2aca0 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2acb0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2ace0 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
2acf0 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20  UUM ? nMaxCells 
2ad00 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  : 0);           
2ad10 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
2ad20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
2ad30 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
2ad40 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
2ad50 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
2ad60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ad70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
2ad80 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ad90 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
2ada0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
2adb0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
2adc0 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
2add0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
2ade0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2adf0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
2ae00 43 6f 70 79 5b 30 5d 29 20 29 3b 0a 20 20 66 6f  Copy[0]) );.  fo
2ae10 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
2ae20 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
2ae30 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
2ae40 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
2ae50 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
2ae60 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
2ae70 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
2ae80 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20 29  u8*)0) & 7)==0 )
2ae90 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67  ; /* 8-byte alig
2aea0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a  nment required *
2aeb0 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20  /.  }.  aSpace1 
2aec0 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70  = &aCopy[NB-1][p
2aed0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
2aee0 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
2aef0 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge))];.  assert(
2af00 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
2af10 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
2af20 3b 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  ;.  if( ISAUTOVA
2af30 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72 6f  CUUM ){.    aFro
2af40 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42 74  m = &aSpace1[pBt
2af50 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d  ->pageSize];.  }
2af60 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71 6c  .  aSpace2 = sql
2af70 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
2af80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2af90 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30 20   if( aSpace2==0 
2afa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2afb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
2afc0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2afd0 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a  up;.  }.  .  /*.
2afe0 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    ** Make copies
2aff0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
2b000 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74 73  of pPage and its
2b010 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61   siblings into a
2b020 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20  Old[]..  ** The 
2b030 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
2b040 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
2b050 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
2b060 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20  ies rather.  ** 
2b070 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
2b080 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
2b090 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2b0a0 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
2b0b0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
2b0c0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
2b0d0 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  n..  */.  for(i=
2b0e0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
2b0f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20  .    MemPage *p 
2b100 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d  = apCopy[i] = (M
2b110 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d  emPage*)aCopy[i]
2b120 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ;.    memcpy(p, 
2b130 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66  apOld[i], sizeof
2b140 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20  (MemPage));.    
2b150 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  p->aData = (void
2b160 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  *)&p[1];.    mem
2b170 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61 70  cpy(p->aData, ap
2b180 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2b190 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2b1a0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f   }..  /*.  ** Lo
2b1b0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
2b1c0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
2b1d0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
2b1e0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
2b1f0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
2b200 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
2b210 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
2b220 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
2b230 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2b240 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
2b250 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  orm aSpace1[] an
2b260 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
2b270 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
2b280 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
2b290 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
2b2a0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
2b2b0 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
2b2c0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
2b2d0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
2b2e0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
2b2f0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
2b300 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
2b310 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
2b320 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
2b330 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
2b340 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
2b350 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
2b360 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
2b370 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
2b380 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
2b390 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
2b3a0 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
2b3b0 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
2b3c0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
2b3d0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
2b3e0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2b3f0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
2b400 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
2b410 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
2b420 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
2b430 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
2b440 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
2b450 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
2b460 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
2b470 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
2b480 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
2b490 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
2b4a0 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a  */.  nCell = 0;.
2b4b0 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
2b4c0 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34   = pPage->leaf*4
2b4d0 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 70  ;.  leafData = p
2b4e0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a 20  Page->hasData;. 
2b4f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
2b500 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
2b510 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2b520 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c  py[i];.    int l
2b530 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2b540 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2b550 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2b560 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2b570 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b580 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2b590 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2b5a0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2b5b0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2b5c0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2b5d0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2b5e0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2b5f0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2b600 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b610 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b620 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d  a;.        aFrom
2b630 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69 3b  [nCell] = (u8)i;
2b640 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20     assert( i>=0 
2b650 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20 20  && i<6 );.      
2b660 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c    for(a=0; a<pOl
2b670 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b  d->nOverflow; a+
2b680 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
2b690 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d  ( pOld->aOvfl[a]
2b6a0 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e  .pCell==apCell[n
2b6b0 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20  Cell] ){.       
2b6c0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
2b6d0 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
2b6e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b700 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b710 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
2b720 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
2b730 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
2b740 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b750 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
2b760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
2b770 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
2b780 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
2b790 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
2b7a0 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
2b7b0 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
2b7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
2b7d0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
2b7e0 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
2b7f0 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
2b800 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
2b810 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
2b820 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
2b830 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
2b840 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
2b850 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
2b860 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
2b870 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
2b880 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
2b890 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
2b8a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b8b0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
2b8c0 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
2b8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b8e0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2b8f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b900 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2b910 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
2b920 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
2b930 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
2b940 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
2b950 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20          iSpace1 
2b960 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
2b970 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2b980 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2b990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2b9a0 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
2b9b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
2b9c0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
2b9d0 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
2b9e0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2b9f0 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2ba00 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2ba10 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2ba20 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UUM ){.         
2ba30 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
2ba40 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a  0xFF;.        }.
2ba50 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2ba60 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2ba70 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 73   sz);.        as
2ba80 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
2ba90 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
2baa0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
2bab0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
2bac0 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c 65  Cell] -= (u16)le
2bad0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2bae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67 65        assert( ge
2baf0 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70  t4byte(pTemp)==p
2bb00 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20  gnoOld[i] );.   
2bb10 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e       if( !pOld->
2bb20 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2bb30 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
2bb40 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
2bb50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bb60 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66  right pointer of
2bb70 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2bb80 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65  pOld becomes the
2bb90 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20 20   left.          
2bba0 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ** pointer of th
2bbb0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  e divider cell *
2bbc0 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
2bbd0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
2bbe0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70  , &pOld->aData[p
2bbf0 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  Old->hdrOffset+8
2bc00 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], 4);.        }
2bc10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2bc20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
2bc30 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
2bc40 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
2bc50 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
2bc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2bc70 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
2bc80 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
2bc90 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
2bca0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2bcb0 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
2bcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bcd0 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  }.        nCell+
2bce0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
2bcf0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2bd00 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
2bd10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
2bd20 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
2bd30 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
2bd40 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
2bd50 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
2bd60 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
2bd70 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2bd80 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
2bd90 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
2bda0 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
2bdb0 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
2bdc0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
2bdd0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
2bde0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
2bdf0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
2be00 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
2be10 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
2be20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
2be30 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
2be40 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
2be50 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
2be60 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
2be70 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
2be80 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
2be90 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
2bea0 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
2beb0 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
2bec0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2bed0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
2bee0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
2bef0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
2bf00 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
2bf10 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
2bf20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
2bf30 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
2bf40 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2bf50 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
2bf60 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2bf70 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2bf80 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
2bf90 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
2bfa0 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
2bfb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
2bfc0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2bfd0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
2bfe0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
2bff0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2c000 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
2c010 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
2c020 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
2c030 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
2c040 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
2c050 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
2c060 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
2c070 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
2c080 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
2c090 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2c0a0 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
2c0b0 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
2c0c0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
2c0d0 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
2c0e0 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
2c0f0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
2c100 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
2c110 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
2c120 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
2c130 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
2c140 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
2c150 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
2c160 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
2c170 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
2c180 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
2c190 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
2c1a0 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
2c1b0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
2c1c0 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
2c1d0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
2c1e0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
2c1f0 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
2c200 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
2c210 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
2c220 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
2c230 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
2c240 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
2c250 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
2c260 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
2c270 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
2c280 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
2c290 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
2c2a0 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
2c2b0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
2c2c0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
2c2d0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
2c2e0 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
2c2f0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
2c300 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
2c310 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
2c320 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
2c330 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
2c340 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
2c350 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
2c360 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
2c370 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
2c380 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
2c390 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
2c3a0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
2c3b0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3d0 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
2c3e0 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
2c3f0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
2c400 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
2c410 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2c420 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
2c430 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
2c440 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
2c450 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
2c460 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
2c470 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
2c480 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
2c490 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
2c4a0 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
2c4b0 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
2c4c0 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
2c4d0 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
2c4e0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
2c4f0 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
2c500 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
2c510 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
2c520 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
2c530 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
2c540 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
2c550 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
2c560 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
2c570 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
2c580 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
2c590 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
2c5a0 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
2c5b0 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
2c5c0 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
2c5d0 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
2c5e0 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
2c5f0 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72  [0])>0) or we ar
2c600 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72  e the.  ** a vir
2c610 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
2c620 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   A virtual root 
2c630 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65  page is when the
2c640 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20   real root.  ** 
2c650 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61  page is page 1 a
2c660 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e  nd we are the on
2c670 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74  ly child of that
2c680 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   page..  */.  as
2c690 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e  sert( cntNew[0]>
2c6a0 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70  0 || (pParent->p
2c6b0 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e  gno==1 && pParen
2c6c0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a  t->nCell==0) );.
2c6d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
2c6e0 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
2c6f0 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
2c700 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
2c710 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c720 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29   pPage->pgno>1 )
2c730 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20  ;.  pageFlags = 
2c740 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b  pPage->aData[0];
2c750 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
2c760 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
2c770 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
2c780 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2c790 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
2c7a0 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
2c7b0 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d      pgnoNew[i] =
2c7c0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20   pgnoOld[i];.   
2c7d0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
2c7e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2c7f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2c800 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
2c810 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
2c820 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c830 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2c840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c850 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
2c860 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2c870 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2c880 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2c890 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69  ew[i], pgnoNew[i
2c8a0 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  -1], 0);.      i
2c8b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2c8c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2c8d0 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
2c8e0 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
2c8f0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
2c900 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
2c910 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
2c920 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
2c930 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
2c940 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
2c950 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2c960 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2c970 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c980 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2c990 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2c9a0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
2c9b0 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
2c9c0 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
2c9d0 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
2c9e0 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
2c9f0 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
2ca00 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
2ca10 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
2ca20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
2ca30 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
2ca40 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
2ca50 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
2ca60 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
2ca70 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
2ca80 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
2ca90 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
2caa0 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
2cab0 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
2cac0 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
2cad0 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
2cae0 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
2caf0 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
2cb00 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
2cb10 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
2cb20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
2cb30 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
2cb40 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
2cb50 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
2cb60 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
2cb70 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
2cb80 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
2cb90 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
2cba0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2cbb0 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
2cbc0 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
2cbd0 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
2cbe0 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
2cbf0 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
2cc00 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
2cc10 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a  V = pgnoNew[i];.
2cc20 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
2cc30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
2cc40 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
2cc50 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d    if( pgnoNew[j]
2cc60 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
2cc70 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
2cc80 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
2cc90 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a  V = pgnoNew[j];.
2cca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ccb0 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
2ccc0 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20        int t;.   
2ccd0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a     MemPage *pT;.
2cce0 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65        t = pgnoNe
2ccf0 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d  w[i];.      pT =
2cd00 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
2cd10 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67   pgnoNew[i] = pg
2cd20 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  noNew[minI];.   
2cd30 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
2cd40 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
2cd50 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d   pgnoNew[minI] =
2cd60 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b   t;.      apNew[
2cd70 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
2cd80 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
2cd90 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
2cda0 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28   %d %d  new: %d(
2cdb0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
2cdc0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
2cdd0 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  n",.    pgnoOld[
2cde0 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  0], .    nOld>=2
2cdf0 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20   ? pgnoOld[1] : 
2ce00 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
2ce10 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c   pgnoOld[2] : 0,
2ce20 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c  .    pgnoNew[0],
2ce30 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
2ce40 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77  New>=2 ? pgnoNew
2ce50 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  [1] : 0, nNew>=2
2ce60 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
2ce70 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70  .    nNew>=3 ? p
2ce80 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e  gnoNew[2] : 0, n
2ce90 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
2cea0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
2ceb0 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20  =4 ? pgnoNew[3] 
2cec0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
2ced0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
2cee0 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e   nNew>=5 ? pgnoN
2cef0 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[4] : 0, nNew>
2cf00 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
2cf10 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  0));..  /*.  ** 
2cf20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
2cf30 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
2cf40 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
2cf50 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
2cf60 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
2cf70 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
2cf80 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
2cf90 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
2cfa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
2cfb0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
2cfc0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
2cfd0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
2cfe0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2cff0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
2d000 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
2d010 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
2d020 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e  ssert( pNew->pgn
2d030 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b  o==pgnoNew[i] );
2d040 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
2d050 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
2d060 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
2d070 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
2d080 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
2d090 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
2d0a0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
2d0b0 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
2d0c0 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
2d0d0 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
2d0e0 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
2d0f0 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  ow==0 );..    /*
2d100 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2d110 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2d120 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2d130 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
2d140 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ies.    ** that 
2d150 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62  point to the sib
2d160 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 20  lings that were 
2d170 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73  rearranged. Thes
2d180 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20  e can be: left. 
2d190 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f     ** children o
2d1a0 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67  f cells, the rig
2d1b0 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
2d1c0 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f  page, or overflo
2d1d0 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70  w pages.    ** p
2d1e0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c  ointed to by cel
2d1f0 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ls..    */.    i
2d200 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2d210 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a  ){.      for(k=j
2d220 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b  ; k<cntNew[i]; k
2d230 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
2d240 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73  ert( k<nMaxCells
2d250 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2d260 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c  aFrom[k]==0xFF |
2d270 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b  | apCopy[aFrom[k
2d280 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
2d290 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
2d2a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2d2b0 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b  Ovfl(pNew, k-j);
2d2c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d2d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d2e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2d2f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d300 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2d310 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
2d320 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50  Cell[k]), PTRMAP
2d330 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
2d340 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  no);.          }
2d350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2d360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d370 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d380 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2d390 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d3b0 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63      }..    j = c
2d3c0 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
2d3d0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2d3e0 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
2d3f0 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
2d400 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
2d410 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
2d420 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
2d430 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
2d440 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
2d450 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31      if( i<nNew-1
2d460 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20   && j<nCell ){. 
2d470 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
2d480 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
2d490 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
2d4a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
2d4b0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2d4c0 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
2d4d0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
2d4e0 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
2d4f0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2d500 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
2d510 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20  ce2[iSpace2];.  
2d520 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
2d530 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
2d540 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
2d550 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
2d560 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
2d570 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20  AUTOVACUUM .    
2d580 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a       && (aFrom[j
2d590 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70  ]==0xFF || apCop
2d5a0 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e  y[aFrom[j]]->pgn
2d5b0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20  o!=pNew->pgno). 
2d5c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d5d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2d5e0 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
2d5f0 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f  (pCell), PTRMAP_
2d600 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
2d610 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  o);.          if
2d620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2d640 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2d650 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
2d660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d670 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44   }else if( leafD
2d680 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ata ){.        /
2d690 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73  * If the tree is
2d6a0 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65   a leaf-data tre
2d6b0 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69  e, and the sibli
2d6c0 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20  ngs are leaves, 
2d6d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
2d6e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76   there is no div
2d6f0 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43  ider cell in apC
2d700 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20  ell[]. Instead, 
2d710 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20  the divider .   
2d720 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e       ** cell con
2d730 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74  sists of the int
2d740 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65  eger key for the
2d750 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
2d760 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   of .        ** 
2d770 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65  the sibling-page
2d780 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65   assembled above
2d790 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a   only..        *
2d7a0 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  /.        CellIn
2d7b0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
2d7c0 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71   j--;.        sq
2d7d0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2d7e0 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
2d7f0 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
2d800 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2d810 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 72  pTemp;.        r
2d820 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
2d830 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30  Parent, pCell, 0
2d840 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
2d850 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20  0, 0, &sz);.    
2d860 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d880 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2d890 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2d8a0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70   }.        pTemp
2d8b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
2d8c0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
2d8d0 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
2d8e0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
2d8f0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
2d900 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
2d910 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
2d920 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
2d930 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
2d940 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
2d950 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
2d960 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
2d970 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
2d980 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
2d990 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
2d9a0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
2d9b0 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74  * (see sqlite3Bt
2d9c0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2d9d0 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
2d9e0 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
2d9f0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
2da00 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
2da10 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
2da20 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
2da30 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
2da40 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
2da50 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
2da60 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
2da70 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2da80 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
2da90 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
2daa0 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
2dab0 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
2dac0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
2dad0 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
2dae0 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
2daf0 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
2db00 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
2db10 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
2db20 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
2db30 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
2db40 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
2db50 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
2db60 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
2db70 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
2db80 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
2db90 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
2dba0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2dbb0 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
2dbc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2dbd0 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20       iSpace2 += 
2dbe0 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2dbf0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2dc00 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2dc10 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d  ssert( iSpace2<=
2dc20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2dc30 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
2dc40 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
2dc50 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
2dc60 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
2dc70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2dc80 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
2dc90 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2dca0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2dcb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2dcc0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2dcd0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 70 75  age) );.      pu
2dce0 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
2dcf0 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
2dd00 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
2dd10 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  no);..      /* I
2dd20 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
2dd30 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
2dd40 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61  e, and not a lea
2dd50 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20  f-data tree,.   
2dd60 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74     ** then updat
2dd70 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2dd80 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20  p with an entry 
2dd90 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2dda0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74   page.      ** t
2ddb0 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73  hat the cell jus
2ddc0 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74  t inserted point
2ddd0 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20  s to (if any).. 
2dde0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2ddf0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26  ( ISAUTOVACUUM &
2de00 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  & !leafData ){. 
2de10 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2de20 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e  apPutOvfl(pParen
2de30 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20  t, nxDiv);.     
2de40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2de50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2de60 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2de70 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
2de80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2de90 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
2dea0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
2deb0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
2dec0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
2ded0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
2dee0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  page. */.    if(
2def0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2df00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2df10 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d  apPut(pBt, pNew-
2df20 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2df30 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2df40 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2df50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2df60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2df70 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2df80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2df90 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
2dfa0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2dfb0 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
2dfc0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
2dfd0 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
2dfe0 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
2dff0 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
2e000 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
2e010 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
2e020 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
2e030 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
2e040 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
2e050 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2e060 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2e070 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2e080 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29  get4byte(zChild)
2e090 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2e0a0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
2e0b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2e0c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e0d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61  .        goto ba
2e0e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2e0f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2e100 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e110 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e120 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2e130 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 6e 78  age) );.  if( nx
2e140 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
2e150 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
2e160 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
2e170 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2e180 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
2e190 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
2e1a0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
2e1b0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2e1c0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2e1d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2e1e0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2e1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e200 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
2e210 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
2e220 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
2e230 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
2e240 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
2e250 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
2e260 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
2e270 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2e280 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2e290 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
2e2a0 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
2e2b0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42    }..  /*.  ** B
2e2c0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
2e2d0 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
2e2e0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
2e2f0 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
2e300 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
2e310 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2e320 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
2e330 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
2e340 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2e350 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
2e360 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
2e370 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
2e380 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2e390 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2e3a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72   );.  sqlite3Scr
2e3b0 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2e3c0 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a  ;.  apCell = 0;.
2e3d0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2e3e0 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
2e3f0 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
2e400 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
2e410 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
2e420 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
2e430 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 70 50  w, nCell));.  pP
2e440 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
2e450 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
2e460 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
2e470 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63 20  ->iPage--;.  rc 
2e480 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
2e490 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
2e4a0 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
2e4b0 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
2e4c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
2e4d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
2e4e0 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20 73  ee(aSpace2);.  s
2e4f0 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
2e500 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
2e510 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2e520 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2e530 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2e540 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2e550 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
2e560 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
2e570 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 43 75  w[i]);.  }.  pCu
2e580 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2e590 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
2e5a0 77 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  w = 0;..  return
2e5b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2e5c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2e5d0 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f  lled for the roo
2e5e0 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65  t page of a btre
2e5f0 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a  e when the root.
2e600 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
2e610 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73   no cells.  This
2e620 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69   is an opportuni
2e630 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ty to make the t
2e640 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72  ree.** shallower
2e650 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a   by one level..*
2e660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2e670 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 42  ance_shallower(B
2e680 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e690 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e6a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2e6b0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 42  * Root page of B
2e6c0 2d 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  -Tree */.  MemPa
2e6d0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20  ge *pChild;     
2e6e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
2e6f0 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f  nly child page o
2e700 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  f pPage */.  Pgn
2e710 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20  o pgnoChild;    
2e720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2e730 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68  e number for pCh
2e740 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ild */.  int rc 
2e750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e760 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2e770 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
2e780 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53  cedures */.  BtS
2e790 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7b0 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73  The main BTree s
2e7c0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
2e7d0 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b  t mxCellPerPage;
2e7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2e7f0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2e800 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a  cells per page *
2e810 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
2e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e830 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72   /* All cells fr
2e840 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  om pages being b
2e850 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
2e860 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
2e870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2e880 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
2e890 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ells */..  asser
2e8a0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2e8b0 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  0 );.  pPage = p
2e8c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2e8d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e8e0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2e8f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e900 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2e910 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2e920 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2e930 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72  pBt;.  mxCellPer
2e940 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70  Page = MX_CELL(p
2e950 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20  Bt);.  apCell = 
2e960 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d  sqlite3Malloc( m
2e970 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73 69  xCellPerPage*(si
2e980 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66  zeof(u8*)+sizeof
2e990 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28 20  (u16)) );.  if( 
2e9a0 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  apCell==0 ) retu
2e9b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2e9c0 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2e9d0 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c  *)&apCell[mxCell
2e9e0 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  PerPage];.  if( 
2e9f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2ea00 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2ea10 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
2ea20 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43 45  pty */.    TRACE
2ea30 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74  (("BALANCE: empt
2ea40 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70  y table %d\n", p
2ea50 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2ea60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
2ea70 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2ea80 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e 65  mpty but has one
2ea90 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66 65   child.  Transfe
2eaa0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66  r the.    ** inf
2eab0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
2eac0 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74  at one child int
2ead0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2eae0 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69  if it .    ** wi
2eaf0 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72 65  ll fit.  This re
2eb00 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68 20  duces the depth 
2eb10 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20 6f  of the tree by o
2eb20 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
2eb30 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * If the root pa
2eb40 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69 74  ge is page 1, it
2eb50 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65 20   has less space 
2eb60 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20  available than. 
2eb70 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64 20     ** its child 
2eb80 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30 20  (due to the 100 
2eb90 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61 74  byte header that
2eba0 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 62   occurs at the b
2ebb0 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  eginning.    ** 
2ebc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ebd0 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67 68  fle), so it migh
2ebe0 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  t not be able to
2ebf0 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65   hold all of the
2ec00 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61   .    ** informa
2ec10 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 63  tion currently c
2ec20 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
2ec30 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73 20  child.  If this 
2ec40 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  is the .    ** c
2ec50 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ase, then do not
2ec60 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65 72   do the transfer
2ec70 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31 20  .  Leave page 1 
2ec80 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20 20  empty except.   
2ec90 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67 68   ** for the righ
2eca0 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  t-pointer to the
2ecb0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2ecc0 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65 63  e child page bec
2ecd0 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  omes.    ** the 
2ece0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20  virtual root of 
2ecf0 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f  the tree..    */
2ed00 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  .    VVA_ONLY( p
2ed10 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
2ed20 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 70 67  ed = 1 );.    pg
2ed30 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2ed40 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2ed50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2ed60 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
2ed70 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
2ed80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2ed90 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61  noChild<=pagerPa
2eda0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  gecount(pPage->p
2edb0 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
2edc0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
2edd0 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
2ede0 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
2edf0 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
2ee00 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
2ee10 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2ee20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
2ee30 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
2ee40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2ee50 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 29  InitPage(pChild)
2ee60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2ee70 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2ee80 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20  w_balance;.     
2ee90 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2eea0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2eeb0 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c  .      if( pChil
2eec0 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b  d->nFree>=100 ){
2eed0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2eee0 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
2eef0 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  n will fit on th
2ef00 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20  e root page, so 
2ef10 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  do the.        *
2ef20 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20  * copy */.      
2ef30 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
2ef40 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c   zeroPage(pPage,
2ef50 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
2ef60 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ]);.        for(
2ef70 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2ef80 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2ef90 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20        apCell[i] 
2efa0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c  = findCell(pChil
2efb0 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d,i);.          
2efc0 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c  szCell[i] = cell
2efd0 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20  SizePtr(pChild, 
2efe0 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  apCell[i]);.    
2eff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2f000 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65  semblePage(pPage
2f010 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c  , pChild->nCell,
2f020 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29   apCell, szCell)
2f030 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70  ;.        /* Cop
2f040 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  y the right-poin
2f050 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
2f060 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20   to the parent. 
2f070 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2f080 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2f090 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2f0a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2f0b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2f0c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2f0d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2f0e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  , .            g
2f0f0 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d  et4byte(&pChild-
2f100 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68  >aData[pChild->h
2f110 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2f120 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2f130 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2f140 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2f150 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2f160 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65  transfer to page
2f170 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2f180 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gno));.      }el
2f190 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2f1a0 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72  he child has mor
2f1b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  e information th
2f1c0 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  at will fit on t
2f1d0 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20  he root..       
2f1e0 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20   ** The tree is 
2f1f0 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64  already balanced
2f200 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a  .  Do nothing. *
2f210 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  /.        TRACE(
2f220 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64  ("BALANCE: child
2f230 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74   %d will not fit
2f240 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   on page 1\n", p
2f250 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2f260 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f270 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2f280 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68  Page->aData, pCh
2f290 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67  ild->aData, pPag
2f2a0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f2b0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
2f2c0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2f2d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f2e0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
2f2f0 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  age);.      asse
2f300 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2f310 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
2f320 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2f330 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2f340 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
2f350 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
2f360 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2f370 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
2f380 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
2f390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2f3a0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2f3b0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
2f3c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f3d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2f3e0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26  ( ISAUTOVACUUM &
2f3f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2f400 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
2f410 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 50  tChildPtrmaps(pP
2f420 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
2f430 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  if.    releasePa
2f440 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a  ge(pChild);.  }.
2f450 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2f460 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  nce:.  sqlite3_f
2f470 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72  ree(apCell);.  r
2f480 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f490 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67  .** The root pag
2f4a0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a  e is overfull.**
2f4b0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68 61  .** When this ha
2f4c0 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61 20  ppens, Create a 
2f4d0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 61  new child page a
2f4e0 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63  nd copy the.** c
2f4f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
2f500 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68 69  oot into the chi
2f510 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20 74  ld.  Then make t
2f520 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
2f530 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
2f540 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70 6f  th rightChild po
2f550 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
2f560 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46 69  w.** child.   Fi
2f570 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61  nally, call bala
2f580 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f  nce_internal() o
2f590 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 0a  n the new child.
2f5a0 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20 74  ** to cause it t
2f5b0 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74  o split..*/.stat
2f5c0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
2f5d0 65 65 70 65 72 28 42 74 43 75 72 73 6f 72 20 2a  eeper(BtCursor *
2f5e0 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f600 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
2f610 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
2f620 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2f630 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  age;     /* Poin
2f640 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ter to the root 
2f650 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  page */.  MemPag
2f660 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a  e *pChild;    /*
2f670 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
2f680 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
2f690 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2f6a0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75  ;     /* Page nu
2f6b0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
2f6c0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
2f6d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
2f6e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2f6f0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
2f700 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  bleSize;     /* 
2f710 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a  Total usable siz
2f720 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20  e of a page */. 
2f730 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2f740 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2f750 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2f760 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74  ge */.  u8 *cdat
2f770 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  a;          /* C
2f780 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68  ontent of the ch
2f790 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ild page */.  in
2f7a0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
2f7b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
2f7c0 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61  age header in pa
2f7d0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rent */.  int cb
2f7e0 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rk;           /*
2f7f0 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65   Offset to conte
2f800 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  nt of first cell
2f810 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20   in parent */.. 
2f820 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2f830 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
2f840 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
2f850 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  e[0]->nOverflow>
2f860 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  0 );..  VVA_ONLY
2f870 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
2f880 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 70  ffled = 1 );.  p
2f890 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f8a0 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d 20  age[0];.  pBt = 
2f8b0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73  pPage->pBt;.  as
2f8c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f8d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2f8e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f8f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f900 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2f910 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2f920 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2f930 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
2f940 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
2f950 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
2f960 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2f970 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
2f980 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f990 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
2f9a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
2f9b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
2f9c0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
2f9d0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2f9e0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2f9f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2fa00 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28  cbrk = get2byte(
2fa10 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
2fa20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d   cdata = pChild-
2fa30 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79  >aData;.  memcpy
2fa40 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64  (cdata, &data[hd
2fa50 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  r], pPage->cellO
2fa60 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e  ffset+2*pPage->n
2fa70 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d  Cell-hdr);.  mem
2fa80 63 70 79 28 26 63 64 61 74 61 5b 63 62 72 6b 5d  cpy(&cdata[cbrk]
2fa90 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
2faa0 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29 3b  sableSize-cbrk);
2fab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ..  assert( pChi
2fac0 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  ld->isInit==0 );
2fad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2fae0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68  treeInitPage(pCh
2faf0 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ild);.  if( rc==
2fb00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fb10 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50 61   int nCopy = pPa
2fb20 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69  ge->nOverflow*si
2fb30 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
2fb40 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  l[0]);.    memcp
2fb50 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
2fb60 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20 6e   pPage->aOvfl, n
2fb70 43 6f 70 79 29 3b 0a 20 20 20 20 70 43 68 69 6c  Copy);.    pChil
2fb80 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
2fb90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Page->nOverflow;
2fba0 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d  .    if( pChild-
2fbb0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
2fbc0 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65      pChild->nFre
2fbd0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
2fbe0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
2fbf0 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e  >nCell==pPage->n
2fc00 43 65 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  Cell );.    asse
2fc10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2fc20 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2fc30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2fc40 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2fc50 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2fc60 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
2fc70 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2fc80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2fc90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2fca0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2fcb0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2fcc0 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
2fcd0 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67  into %d\n", pPag
2fce0 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  e->pgno, pChild-
2fcf0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66 28  >pgno));.    if(
2fd00 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2fd10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2fd20 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c  apPut(pBt, pChil
2fd30 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  d->pgno, PTRMAP_
2fd40 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67  BTREE, pPage->pg
2fd50 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
2fd60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2fd70 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 72 63  UUM.      if( rc
2fd80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fd90 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 43         rc = setC
2fda0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 43 68 69  hildPtrmaps(pChi
2fdb0 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
2fdc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2fdd0 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76       pChild->nOv
2fde0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
2fdf0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2fe00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2fe10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fe20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
2fe30 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2fe40 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20  [1] = pChild;.  
2fe50 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
2fe60 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
2fe70 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2fe80 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2fe90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2fea0 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 72  Child);.  }..  r
2feb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fec0 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
2fed0 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
2fee0 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
2fef0 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
2ff00 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
2ff10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
2ff20 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
2ff30 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
2ff40 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
2ff50 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
2ff60 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
2ff70 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
2ff80 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
2ff90 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 2a  g .** routine..*
2ffa0 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  * .** Parameter 
2ffb0 69 73 49 6e 73 65 72 74 20 69 73 20 74 72 75 65  isInsert is true
2ffc0 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c 20 77   if a new cell w
2ffd0 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64  as just inserted
2ffe0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67   into the.** pag
2fff0 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
30000 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
30010 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43   int balance(BtC
30020 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
30030 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20 69 6e   isInsert){.  in
30040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
30050 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
30060 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
30070 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
30080 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30090 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
300a0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
300b0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
300c0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
300d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
300e0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
300f0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
30100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
30110 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30120 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  w>0 ){.      rc 
30130 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
30140 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61 73  (pCur);.      as
30150 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
30160 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b 0a  ge[0]==pPage );.
30170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
30180 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
30190 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
301a0 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OK );.    }.    
301b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
301c0 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K && pPage->nCel
301d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
301e0 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c   = balance_shall
301f0 6f 77 65 72 28 70 43 75 72 29 3b 0a 20 20 20 20  ower(pCur);.    
30200 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30210 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65  apPage[0]==pPage
30220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
30230 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
30240 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c  ow==0 || rc!=SQL
30250 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a  ITE_OK );.    }.
30260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
30270 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30280 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  w>0 || .        
30290 28 21 69 73 49 6e 73 65 72 74 20 26 26 20 70 50  (!isInsert && pP
302a0 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65  age->nFree>pPage
302b0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
302c0 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20  e*2/3) ){.      
302d0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
302e0 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20 20  root(pCur);.    
302f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
30300 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
30310 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
30320 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74  all cursors that
30330 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20   point to table 
30340 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20  pgnoRoot..** If 
30350 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72  any of those cur
30360 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64  sors were opened
30370 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
30380 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  in a different.*
30390 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
303a0 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73  ction (a databas
303b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  e connection tha
303c0 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67  t shares the pag
303d0 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68  er.** cache with
303e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
303f0 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61  nection) and tha
30400 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  t other connecti
30410 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  on .** is not in
30420 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d   the ReadUncommm
30430 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65  itted state, the
30440 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
30450 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
30460 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20  E_LOCKED..**.** 
30470 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f  As well as curso
30480 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  rs with wrFlag==
30490 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68 20  0, cursors with 
304a0 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  .** isIncrblobHa
304b0 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73 6f  ndle==1 are also
304c0 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65 61   considered 'rea
304d0 64 27 20 63 75 72 73 6f 72 73 20 62 65 63 61 75  d' cursors becau
304e0 73 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  se.** incrementa
304f0 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 61  l blob cursors a
30500 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  re used for both
30510 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
30520 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ting..**.** When
30530 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
30540 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e   root page of an
30550 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
30560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30570 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  also.** responsi
30580 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64 61  ble for invalida
30590 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c  ting incremental
305a0 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77 68   blob cursors wh
305b0 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 77  en the table row
305c0 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65  .** on which the
305d0 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73 20  y are opened is 
305e0 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66  deleted or modif
305f0 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72 65  ied. Cursors are
30600 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
30610 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
30620 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73   following rules
30630 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
30640 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  n BtreeClearTabl
30650 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  e() is called to
30660 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65   completely dele
30670 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  te the contents.
30680 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d 54  **      of a B-T
30690 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63 6c  ree table, pExcl
306a0 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ude is set to ze
306b0 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  ro and parameter
306c0 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20   iRow is .**    
306d0 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72    set to non-zer
306e0 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  o. In this case 
306f0 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  all incremental 
30700 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
30710 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  n.**      on the
30720 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
30730 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e   pgnoRoot are in
30740 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
30750 20 20 20 32 29 20 57 68 65 6e 20 42 74 72 65 65     2) When Btree
30760 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65 44  Insert(), BtreeD
30770 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
30780 50 75 74 44 61 74 61 28 29 20 69 73 20 63 61 6c  PutData() is cal
30790 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  led to .**      
307a0 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20 72  modify a table r
307b0 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73 74  ow via an SQL st
307c0 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64  atement, pExclud
307d0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
307e0 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20 63  .**      write c
307f0 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64 6f  ursor used to do
30800 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f   the modificatio
30810 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  n and parameter 
30820 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20 20  iRow is set.**  
30830 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 67      to the integ
30840 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68 65  er row id of the
30850 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62 65   B-Tree entry be
30860 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e  ing modified. Un
30870 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45 78  less.**      pEx
30880 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66 20  clude is itself 
30890 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  an incremental b
308a0 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  lob cursor, then
308b0 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c   all incremental
308c0 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63 75  .**      blob cu
308d0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f  rsors open on ro
308e0 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42 2d  w iRow of the B-
308f0 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69 64  Tree are invalid
30900 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29  ated..**.**   3)
30910 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75 64   If both pExclud
30920 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20 73  e and iRow are s
30930 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69  et to zero, no i
30940 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
30950 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72 73  .**      cursors
30960 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
30970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30980 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
30990 6c 69 63 74 73 28 0a 20 20 42 74 72 65 65 20 2a  licts(.  Btree *
309a0 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
309b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
309c0 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
309d0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  /.  Pgno pgnoRoo
309e0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  t,          /* L
309f0 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63 75 72  ook for read cur
30a00 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62 74 72  sors on this btr
30a10 65 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  ee */.  BtCursor
30a20 20 2a 70 45 78 63 6c 75 64 65 2c 20 20 20 20 20   *pExclude,     
30a30 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69 73 20 63  /* Ignore this c
30a40 75 72 73 6f 72 20 2a 2f 0a 20 20 69 36 34 20 69  ursor */.  i64 i
30a50 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 20  Row             
30a60 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
30a70 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
30a80 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 42  anging */.){.  B
30a90 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
30aa0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
30ab0 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
30ac0 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
30ad0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
30ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
30af0 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
30b00 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
30b10 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
30b20 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
30b30 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63   p==pExclude ) c
30b40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
30b50 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67   p->pgnoRoot!=pg
30b60 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75  noRoot ) continu
30b70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
30b80 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
30b90 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63      if( p->isInc
30ba0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28  rblobHandle && (
30bb0 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45 78   .         (!pEx
30bc0 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20  clude && iRow). 
30bd0 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64       || (pExclud
30be0 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e  e && !pExclude->
30bf0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
30c00 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   && p->info.nKey
30c10 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a  ==iRow).    )){.
30c20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
30c30 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
30c40 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
30c50 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
30c60 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
30c70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
30c80 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20  f( p->wrFlag==0 
30c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30ca0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
30cb0 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62     || p->isIncrb
30cc0 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66  lobHandle.#endif
30cd0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
30ce0 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d  lite3 *dbOther =
30cf0 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a   p->pBtree->db;.
30d00 20 20 20 20 20 20 61 73 73 65 72 74 28 64 62 4f        assert(dbO
30d10 74 68 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ther);.      if(
30d20 20 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20   dbOther!=db && 
30d30 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20  (dbOther->flags 
30d40 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
30d50 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 20 29 7b 0a  ommitted)==0 ){.
30d60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
30d70 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
30d80 28 64 62 2c 20 64 62 4f 74 68 65 72 29 3b 0a 20  (db, dbOther);. 
30d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
30da0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
30db0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d  EDCACHE;.      }
30dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
30dd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30de0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
30df0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
30e00 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
30e10 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
30e20 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
30e30 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
30e40 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
30e50 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
30e60 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
30e70 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
30e80 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
30e90 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
30ea0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
30eb0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
30ec0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
30ed0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
30ee0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
30ef0 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
30f00 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
30f10 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
30f20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
30f30 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
30f40 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
30f50 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
30f60 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
30f70 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
30f80 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
30f90 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
30fa0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
30fb0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
30fc0 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
30fd0 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
30fe0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
30ff0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
31000 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
31010 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
31020 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
31030 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
31040 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
31050 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
31060 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
31070 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
31080 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31090 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
310a0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
310b0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
310c0 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
310d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
310e0 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
310f0 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
31100 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
31110 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
31120 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
31130 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31140 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
31150 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
31160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
31170 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
31180 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
31190 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
311a0 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
311b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
311c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
311d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
311e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
311f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
31200 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
31210 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
31220 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
31230 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63 68  lag );.  rc = ch
31240 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
31250 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65  cts(pCur->pBtree
31260 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
31270 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b 0a 20  , pCur, nKey);. 
31280 20 69 66 28 20 72 63 20 29 7b 20 20 20 20 20 20   if( rc ){      
31290 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 54         .    /* T
312a0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
312b0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
312c0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 61  ad lock */.    a
312d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
312e0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
312f0 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74 75  ACHE );.    retu
31300 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
31310 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
31320 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
31330 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
31340 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  skip;.  }..  /* 
31350 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
31360 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
31370 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
31380 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
31390 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
313a0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
313b0 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45   if( .    SQLITE
313c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
313d0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
313e0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
313f0 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  Cur)) ||.    SQL
31400 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
31410 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
31420 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65  (pCur, pKey, nKe
31430 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26  y, appendBias, &
31440 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  loc)).  ){.    r
31450 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
31460 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
31470 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
31480 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
31490 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
314a0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
314b0 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
314c0 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
314d0 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49  y );.  TRACE(("I
314e0 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
314f0 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
31500 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
31510 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
31520 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
31530 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
31540 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
31550 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
31560 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
31570 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
31580 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
31590 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  .  allocateTempS
315a0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77  pace(pBt);.  new
315b0 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
315c0 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77  Space;.  if( new
315d0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
315e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
315f0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
31600 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
31610 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
31620 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
31630 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
31640 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
31650 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
31660 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
31670 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
31680 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
31690 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
316a0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
316b0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
316c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
316d0 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43   if( loc==0 && C
316e0 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
316f0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
31700 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
31710 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67  assert( idx<pPag
31720 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
31730 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31740 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
31750 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31760 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
31770 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
31780 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d   }.    oldCell =
31790 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
317a0 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21   idx);.    if( !
317b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
317c0 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43       memcpy(newC
317d0 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29  ell, oldCell, 4)
317e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c  ;.    }.    szOl
317f0 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  d = cellSizePtr(
31800 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
31810 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43  .    rc = clearC
31820 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  ell(pPage, oldCe
31830 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ll);.    if( rc 
31840 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
31850 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70  t;.    rc = drop
31860 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
31870 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28   szOld);.    if(
31880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31890 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   {.      goto en
318a0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a  d_insert;.    }.
318b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
318c0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
318d0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
318e0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
318f0 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43  ;.    idx = ++pC
31900 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
31910 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75 72  iPage];.    pCur
31920 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
31930 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
31940 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  dNKey = 0;.  }el
31950 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
31960 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
31970 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74   }.  rc = insert
31980 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c  Cell(pPage, idx,
31990 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
319a0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
319b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
319c0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
319d0 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20  pCur, 1);.  }.. 
319e0 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
319f0 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
31a00 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
31a10 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
31a20 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73 2e 20  e().  ** fails. 
31a30 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   Internal data s
31a40 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
31a50 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ion will result 
31a60 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20  otherwise. */.  
31a70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
31a80 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72  r->iPage]->nOver
31a90 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69 66 28  flow = 0;..  if(
31aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31ab0 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
31ac0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f  (pCur);.  }.end_
31ad0 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e  insert:.  return
31ae0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
31af0 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74  lete the entry t
31b00 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
31b10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
31b20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
31b30 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
31b40 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f  t a arbitrary lo
31b50 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  cation..*/.int s
31b60 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
31b70 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
31b80 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
31b90 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
31ba0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
31bb0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 75 6e  .  int idx;.  un
31bc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
31bd0 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ll;.  int rc;.  
31be0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
31bf0 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d   0;.  Btree *p =
31c00 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
31c10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
31c20 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
31c30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
31c40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
31c50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
31c60 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
31c70 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
31c80 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
31c90 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
31ca0 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
31cb0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
31cc0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
31cd0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
31ce0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
31cf0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
31d00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
31d10 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
31d20 65 6c 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ell) ){.    retu
31d30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
31d40 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
31d50 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
31d60 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  to anything */. 
31d70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
31d80 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72  r->wrFlag );.  r
31d90 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
31da0 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75  Conflicts(p, pCu
31db0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
31dc0 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  r, pCur->info.nK
31dd0 65 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ey);.  if( rc!=S
31de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31df0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75  /* The table pCu
31e00 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  r points to has 
31e10 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
31e20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
31e30 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
31e40 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20 20  REDCACHE );.    
31e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
31e60 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
31e70 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
31e80 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
31e90 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
31ea0 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
31eb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
31ec0 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
31ed0 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
31ee0 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
31ef0 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
31f00 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
31f10 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
31f20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31f30 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
31f40 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
31f50 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
31f60 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
31f70 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
31f80 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
31f90 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
31fa0 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
31fb0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
31fc0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
31fd0 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
31fe0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
31ff0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
32000 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
32010 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
32020 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
32030 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
32040 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65   its page and le
32050 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
32060 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
32070 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
32080 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
32090 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
320a0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
320b0 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
320c0 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
320d0 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
320e0 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20  t..  */.  idx = 
320f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
32100 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c  ->iPage];.  pCel
32110 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
32120 67 65 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  ge, idx);.  if( 
32130 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
32140 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
32150 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
32160 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61  .  }.  rc = clea
32170 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
32180 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ll);.  if( rc ){
32190 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
321a0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
321b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
321c0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
321d0 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
321e0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
321f0 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
32200 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
32210 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
32220 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
32230 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
32240 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
32250 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
32260 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
32270 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
32280 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
32290 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
322a0 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
322b0 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
322c0 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
322d0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
322e0 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
322f0 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
32300 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
32310 61 66 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61  afCur;.    MemPa
32320 67 65 20 2a 70 4c 65 61 66 50 61 67 65 20 3d 20  ge *pLeafPage = 
32330 30 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  0;..    unsigned
32340 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20   char *pNext;.  
32350 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
32360 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32370 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a   *tempCell = 0;.
32380 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
32390 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
323a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
323b0 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
323c0 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  , &leafCur);.   
323d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
323e0 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
323f0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
32400 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32410 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
32420 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  t( leafCur.aiIdx
32430 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d  [leafCur.iPage]=
32440 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 61  =0 );.      pLea
32450 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e  fPage = leafCur.
32460 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69  apPage[leafCur.i
32470 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 72 63 20  Page];.      rc 
32480 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32490 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70  ite(pLeafPage->p
324a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
324b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
324c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
324d0 74 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61  t leafCursorInva
324e0 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  lid = 0;.      u
324f0 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20  16 szNext;.     
32500 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
32510 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
32520 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25   internal from %
32530 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c  d replace from l
32540 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
32550 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
32560 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ot, pPage->pgno,
32570 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f   pLeafPage->pgno
32580 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43 65  ));.      dropCe
32590 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63  ll(pPage, idx, c
325a0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
325b0 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20  , pCell));.     
325c0 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65 6c   pNext = findCel
325d0 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30 29 3b  l(pLeafPage, 0);
325e0 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
325f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61  cellSizePtr(pLea
32600 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20  fPage, pNext);. 
32610 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f       assert( MX_
32620 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d  CELL_SIZE(pBt)>=
32630 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20  szNext+4 );.    
32640 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
32650 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
32660 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e  tempCell = pBt->
32670 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
32680 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30   if( tempCell==0
32690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
326a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
326b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
326c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
326d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  {.        rc = i
326e0 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
326f0 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73   idx, pNext-4, s
32700 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c  zNext+4, tempCel
32710 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 0);.      }..
32720 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 69  .      /* The "i
32730 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  f" statement in 
32740 74 68 65 20 6e 65 78 74 20 63 6f 64 65 20 62 6c  the next code bl
32750 6f 63 6b 20 69 73 20 63 72 69 74 69 63 61 6c 2e  ock is critical.
32760 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 73    The.      ** s
32770 6c 69 67 68 74 65 73 74 20 65 72 72 6f 72 20 69  lightest error i
32780 6e 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  n that statement
32790 20 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51 4c   would allow SQL
327a0 69 74 65 20 74 6f 20 6f 70 65 72 61 74 65 0a 20  ite to operate. 
327b0 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c       ** correctl
327c0 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 69  y most of the ti
327d0 6d 65 20 62 75 74 20 70 72 6f 64 75 63 65 20 76  me but produce v
327e0 65 72 79 20 72 61 72 65 20 66 61 69 6c 75 72 65  ery rare failure
327f0 73 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a 20  s.  To.      ** 
32800 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 74 68  guard against th
32810 69 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  is, the followin
32820 67 20 6d 61 63 72 6f 73 20 68 65 6c 70 20 74 6f  g macros help to
32830 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20   verify that.   
32840 20 20 20 2a 2a 20 74 68 65 20 22 69 66 22 20 73     ** the "if" s
32850 74 61 74 65 6d 65 6e 74 20 69 73 20 77 65 6c 6c  tatement is well
32860 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20 20 2a   tested..      *
32870 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
32880 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
32890 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
328a0 6e 46 72 65 65 3c 70 42 74 2d 3e 75 73 61 62 6c  nFree<pBt->usabl
328b0 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20 20  eSize*2/3 .     
328c0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
328d0 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
328e0 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d 3e  2+szNext > pBt->
328f0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29  usableSize*2/3 )
32900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
32910 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
32920 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
32930 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62  nFree==pBt->usab
32940 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20  leSize*2/3 .    
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
32960 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
32970 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
32980 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
32990 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
329a0 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  e( pPage->nOverf
329b0 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  low==0 && pPage-
329c0 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61  >nFree==pBt->usa
329d0 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a 20  bleSize*2/3+1 . 
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329f0 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  && pLeafPage->nF
32a00 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
32a10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32a20 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  /3 );.      test
32a30 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76  case( pPage->nOv
32a40 65 72 66 6c 6f 77 3e 30 20 26 26 20 70 50 61 67  erflow>0 && pPag
32a50 65 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e 75  e->nFree<=pBt->u
32a60 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20 20  sableSize*2/3.  
32a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
32a80 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72  & pLeafPage->nFr
32a90 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
32aa0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
32ab0 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  3 );.      testc
32ac0 61 73 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f 76  ase( (pPage->nOv
32ad0 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50 61  erflow>0 || (pPa
32ae0 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74 2d  ge->nFree > pBt-
32af0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
32b00 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
32b10 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
32b20 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
32b30 3d 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  == pBt->usableSi
32b40 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20 20  ze*2/3 );...    
32b50 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 6e 4f    if( (pPage->nO
32b60 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50  verflow>0 || (pP
32b70 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74  age->nFree > pBt
32b80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
32b90 29 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  )) &&.          
32ba0 28 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65  (pLeafPage->nFre
32bb0 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
32bc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
32bd0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
32be0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
32bf0 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74 68  h is taken if th
32c00 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
32c10 69 73 20 6e 6f 77 20 65 69 74 68 65 72 20 6f 76  is now either ov
32c20 65 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  erflowing.      
32c30 20 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75 6c    ** or underful
32c40 6c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 6e  l and the leaf n
32c50 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 6e 64 65  ode will be unde
32c60 72 66 75 6c 6c 20 61 66 74 65 72 20 74 68 65 20  rfull after the 
32c70 6a 75 73 74 20 63 65 6c 6c 20 0a 20 20 20 20 20  just cell .     
32c80 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f 20     ** copied to 
32c90 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
32ca0 65 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  e is deleted fro
32cb0 6d 20 69 74 2e 20 54 68 69 73 20 69 73 20 61 20  m it. This is a 
32cc0 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20 20  special.        
32cd0 2a 2a 20 63 61 73 65 20 62 65 63 61 75 73 65 20  ** case because 
32ce0 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  the call to bala
32cf0 6e 63 65 28 29 20 74 6f 20 63 6f 72 72 65 63 74  nce() to correct
32d00 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
32d10 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  de.        ** ma
32d20 79 20 63 68 61 6e 67 65 20 74 68 65 20 74 72 65  y change the tre
32d30 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
32d40 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
32d50 6f 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20 20 20  ontents of.     
32d60 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 43 75     ** the leafCu
32d70 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c  r.apPage[] and l
32d80 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20 61  eafCur.aiIdx[] a
32d90 72 72 61 79 73 2c 20 77 68 69 63 68 20 77 69 6c  rrays, which wil
32da0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
32db0 75 73 65 64 20 62 79 20 74 68 65 20 62 61 6c 61  used by the bala
32dc0 6e 63 65 28 29 20 72 65 71 75 69 72 65 64 20 74  nce() required t
32dd0 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 75 6e  o correct the un
32de0 64 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20 20  derfull leaf.   
32df0 20 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20 20       ** node..  
32e00 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
32e10 20 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61 20   ** The formula 
32e20 75 73 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  used in the expr
32e30 65 73 73 69 6f 6e 20 61 62 6f 76 65 20 61 72 65  ession above are
32e40 20 62 61 73 65 64 20 6f 6e 20 66 61 63 65 74 73   based on facets
32e50 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
32e60 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 2d 66  he SQLite file-f
32e70 6f 72 6d 61 74 20 74 68 61 74 20 64 6f 20 6e 6f  ormat that do no
32e80 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69  t change over ti
32e90 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  me..        */. 
32ea0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32eb0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
32ec0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
32ed0 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  /3+1 );.        
32ee0 74 65 73 74 63 61 73 65 28 20 70 4c 65 61 66 50  testcase( pLeafP
32ef0 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
32f00 65 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65  ext==pBt->usable
32f10 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20  Size*2/3+1 );.  
32f20 20 20 20 20 20 20 6c 65 61 66 43 75 72 73 6f 72        leafCursor
32f30 49 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  Invalid = 1;.   
32f40 20 20 20 7d 20 20 20 20 20 20 20 20 0a 0a 20 20     }        ..  
32f50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32f70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32f80 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32f90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
32fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34   );.        put4
32fb0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
32fc0 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  wCell(pPage, idx
32fd0 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ), pgnoChild);. 
32fe0 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28         VVA_ONLY(
32ff0 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66   pCur->pagesShuf
33000 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20  fled = 0 );.    
33010 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
33020 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  (pCur, 0);.     
33030 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
33040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
33050 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64  eafCursorInvalid
33060 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
33070 68 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69 73 20  he leaf-node is 
33080 6e 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20 61 6e  now underfull an
33090 64 20 73 6f 20 74 68 65 20 74 72 65 65 20 6e 65  d so the tree ne
330a0 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 20  eds to be .     
330b0 20 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64     ** rebalanced
330c0 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 62  . However, the b
330d0 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61 74 69  alance() operati
330e0 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  on on the intern
330f0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  al.        ** no
33100 64 65 20 61 62 6f 76 65 20 6d 61 79 20 68 61 76  de above may hav
33110 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 73  e modified the s
33120 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65 20  tructure of the 
33130 42 2d 54 72 65 65 20 61 6e 64 0a 20 20 20 20 20  B-Tree and.     
33140 20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63 75 72     ** so the cur
33150 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
33160 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
33170 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69  ] and leafCur.ai
33180 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a  Idx[].        **
33190 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
331a0 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ted..        **.
331b0 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73          ** It is
331c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
331d0 20 63 6f 70 79 20 74 68 65 20 61 6e 63 65 73 74   copy the ancest
331e0 72 79 20 66 72 6f 6d 20 70 43 75 72 2c 20 61 73  ry from pCur, as
331f0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
33200 20 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29 20 63    ** balance() c
33210 61 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69 64 61  all has invalida
33220 74 65 64 20 74 68 65 20 70 43 75 72 2d 3e 61 70  ted the pCur->ap
33230 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
33240 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72  [].        ** ar
33250 72 61 79 73 2e 20 0a 20 20 20 20 20 20 20 20 2a  rays. .        *
33260 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65  *.        ** The
33270 20 63 61 6c 6c 20 74 6f 20 73 61 76 65 43 75 72   call to saveCur
33280 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 62 65  sorPosition() be
33290 6c 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79 20 73  low internally s
332a0 61 76 65 73 20 74 68 65 20 0a 20 20 20 20 20 20  aves the .      
332b0 20 20 2a 2a 20 6b 65 79 20 74 68 61 74 20 6c 65    ** key that le
332c0 61 66 43 75 72 20 69 73 20 63 75 72 72 65 6e 74  afCur is current
332d0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
332e0 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 72 65  Currently, there
332f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
33300 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 20 74 68  two copies of th
33310 61 74 20 6b 65 79 20 69 6e 20 74 68 65 20 74 72  at key in the tr
33320 65 65 20 2d 20 6f 6e 65 20 68 65 72 65 20 6f 6e  ee - one here on
33330 20 74 68 65 20 6c 65 61 66 0a 20 20 20 20 20 20   the leaf.      
33340 20 20 2a 2a 20 70 61 67 65 20 61 6e 64 20 6f 6e    ** page and on
33350 65 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65 72 6e  e on some intern
33360 61 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 74  al node in the t
33370 72 65 65 2e 20 54 68 65 20 63 6f 70 79 20 6f 6e  ree. The copy on
33380 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
33390 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 61 6c 77  leaf node is alw
333a0 61 79 73 20 74 68 65 20 6e 65 78 74 20 6b 65 79  ays the next key
333b0 20 69 6e 20 74 72 65 65 2d 6f 72 64 65 72 20 61   in tree-order a
333c0 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
333d0 20 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74 68 65    ** copy on the
333e0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20   internal node. 
333f0 53 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  So, the call to 
33400 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
33410 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ().        ** ca
33420 6c 6c 73 20 72 65 73 74 6f 72 65 43 75 72 73 6f  lls restoreCurso
33430 72 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f 20 70  rPosition() to p
33440 6f 69 6e 74 20 74 68 65 20 63 75 72 73 6f 72 20  oint the cursor 
33450 74 6f 20 74 68 65 20 63 6f 70 79 0a 20 20 20 20  to the copy.    
33460 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 6f 6e      ** stored on
33470 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
33480 64 65 2c 20 74 68 65 6e 20 61 64 76 61 6e 63 65  de, then advance
33490 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  s to the next en
334a0 74 72 79 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  try,.        ** 
334b0 77 68 69 63 68 20 68 61 70 70 65 6e 73 20 74 6f  which happens to
334c0 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20   be the copy of 
334d0 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65 20 69  the key on the i
334e0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 20 20  nternal node..  
334f0 20 20 20 20 20 20 2a 2a 20 4e 65 74 20 65 66 66        ** Net eff
33500 65 63 74 3a 20 6c 65 61 66 43 75 72 20 69 73 20  ect: leafCur is 
33510 70 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20 74 6f  pointing back to
33520 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
33530 65 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ell.        ** t
33540 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
33550 72 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74 68 65  removed, and the
33560 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
33570 5d 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  ] and.        **
33580 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d   leafCur.aiIdx[]
33590 20 61 72 72 61 79 73 20 61 72 65 20 63 6f 72 72   arrays are corr
335a0 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ect..        */.
335b0 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
335c0 28 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e 6f 20  ( Pgno leafPgno 
335d0 3d 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e  = pLeafPage->pgn
335e0 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  o );.        rc 
335f0 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
33600 74 69 6f 6e 28 26 6c 65 61 66 43 75 72 29 3b 0a  tion(&leafCur);.
33610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
33620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33630 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33640 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65  te3BtreeNext(&le
33650 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  afCur, &notUsed)
33660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33670 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20      pLeafPage = 
33680 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c  leafCur.apPage[l
33690 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20  eafCur.iPage];. 
336a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
336b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
336c0 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 3d  pLeafPage->pgno=
336d0 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 20  =leafPgno );.   
336e0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
336f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6c 65  =SQLITE_OK || le
33700 61 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66  afCur.aiIdx[leaf
33710 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b  Cur.iPage]==0 );
33720 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33730 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
33740 63 0a 20 20 20 20 20 20 20 26 26 20 53 51 4c 49  c.       && SQLI
33750 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
33760 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33770 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67  LeafPage->pDbPag
33780 65 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  e)) .      ){.  
33790 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
337a0 4c 65 61 66 50 61 67 65 2c 20 30 2c 20 73 7a 4e  LeafPage, 0, szN
337b0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ext);.        VV
337c0 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75 72 2e  A_ONLY( leafCur.
337d0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20  pagesShuffled = 
337e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
337f0 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65 61 66 43  = balance(&leafC
33800 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
33810 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 73  assert( leafCurs
33820 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21 6c 65  orInvalid || !le
33830 61 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66  afCur.pagesShuff
33840 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  led.            
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33860 20 20 20 20 20 20 20 7c 7c 20 21 70 43 75 72 2d         || !pCur-
33870 3e 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 29  >pagesShuffled )
33880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33890 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
338a0 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f  ReleaseTempCurso
338b0 72 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d  r(&leafCur);.  }
338c0 65 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28  else{.    TRACE(
338d0 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
338e0 25 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c  %d delete from l
338f0 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
33900 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
33910 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
33920 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
33930 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63  ll(pPage, idx, c
33940 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
33950 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 69  , pCell));.    i
33960 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
33980 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b  alance(pCur, 0);
33990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
339a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
339b0 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
339c0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCur);.  }.  re
339d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
339e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42  * Create a new B
339f0 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69  Tree table.  Wri
33a00 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65  te into *piTable
33a10 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
33a20 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ber for the root
33a30 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77   page of the new
33a40 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
33a50 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69  e type of type i
33a60 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
33a70 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
33a80 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a  ter.  Only the.*
33a90 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75  * following valu
33aa0 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20  es of flags are 
33ab0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
33ac0 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  .  Other values 
33ad0 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67  for.** flags mig
33ae0 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a  ht not work:.**.
33af0 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54  **     BTREE_INT
33b00 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41  KEY|BTREE_LEAFDA
33b10 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20  TA     Used for 
33b20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20  SQL tables with 
33b30 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20  rowid keys.**   
33b40 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41    BTREE_ZERODATA
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b60 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69    Used for SQL i
33b70 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63  ndices.*/.static
33b80 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65   int btreeCreate
33b90 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
33ba0 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
33bb0 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68  t flags){.  BtSh
33bc0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33bd0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
33be0 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Root;.  Pgno pgn
33bf0 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b  oRoot;.  int rc;
33c00 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33c10 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
33c20 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
33c30 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
33c40 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
33c50 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
33c60 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
33c70 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
33c80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33c90 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
33ca0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
33cb0 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74  pRoot, &pgnoRoot
33cc0 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 1, 0);.  if( r
33cd0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
33ce0 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  rc;.  }.#else.  
33cf0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
33d00 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
33d10 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f  pgnoMove;      /
33d20 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65  * Move a page he
33d30 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  re to make room 
33d40 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
33d50 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  e */.    MemPage
33d60 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20   *pPageMove; /* 
33d70 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  The page to move
33d80 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   to. */..    /* 
33d90 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74  Creating a new t
33da0 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c  able may probabl
33db0 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
33dc0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74   an existing dat
33dd0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20  abase.    ** to 
33de0 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68  make room for th
33df0 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f  e new tables roo
33e00 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20  t page. In case 
33e10 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a  this page turns.
33e20 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65      ** out to be
33e30 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
33e40 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76  e, delete all ov
33e50 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20  erflow page-map 
33e60 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65  caches.    ** he
33e70 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f  ld by open curso
33e80 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rs..    */.    i
33e90 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
33ea0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
33eb0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
33ec0 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33   value of meta[3
33ed0 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  ] from the datab
33ee0 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ase to determine
33ef0 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a   where the.    *
33f00 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * root page of t
33f10 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f  he new table sho
33f20 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20  uld go. meta[3] 
33f30 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  is the largest r
33f40 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
33f50 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20  created so far, 
33f60 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  so the new root-
33f70 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d  page is (meta[3]
33f80 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  +1)..    */.    
33f90 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
33fa0 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
33fb0 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
33fc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33fd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
33fe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
33ff0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20  gnoRoot++;..    
34000 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d  /* The new root-
34010 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
34020 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70  allocated on a p
34030 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
34040 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50   or the.    ** P
34050 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65  ENDING_BYTE page
34060 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
34070 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54  le( pgnoRoot==PT
34080 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
34090 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20   pgnoRoot) ||.  
340a0 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d        pgnoRoot==
340b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
340c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
340d0 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20  pgnoRoot++;.    
340e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  }.    assert( pg
340f0 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20  noRoot>=3 );..  
34100 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
34110 70 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74  page. The page t
34120 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  hat currently re
34130 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f  sides at pgnoRoo
34140 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  t will.    ** be
34150 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c   moved to the al
34160 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e  located page (un
34170 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74  less the allocat
34180 65 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a  ed page happens.
34190 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65      ** to reside
341a0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20   at pgnoRoot).. 
341b0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61     */.    rc = a
341c0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
341d0 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65  (pBt, &pPageMove
341e0 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e  , &pgnoMove, pgn
341f0 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69  oRoot, 1);.    i
34200 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34210 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
34220 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
34230 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67  if( pgnoMove!=pg
34240 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
34250 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  /* pgnoRoot is t
34260 68 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  he page that wil
34270 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68  l be used for th
34280 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20  e root-page of. 
34290 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
342a0 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20  table (assuming 
342b0 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74  an error did not
342c0 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20   occur). But we 
342d0 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  were.      ** al
342e0 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65  located pgnoMove
342f0 2e 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69  . If required (i
34300 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f  .e. if it was no
34310 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  t allocated.    
34320 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e    ** by extendin
34330 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65  g the file), the
34340 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74   current page at
34350 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f   position pgnoMo
34360 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  ve.      ** is a
34370 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64  lready journaled
34380 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34390 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
343a0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
343b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
343c0 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a  ge(pPageMove);..
343d0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68        /* Move th
343e0 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
343f0 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20   at pgnoRoot to 
34400 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20  pgnoMove. */.   
34410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
34420 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34430 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
34440 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
34450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34460 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
34470 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
34480 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
34490 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  t(pBt, pgnoRoot,
344a0 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
344b0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
344c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
344d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
344e0 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d  OTPAGE || eType=
344f0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
34500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
34510 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
34520 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34530 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
34540 20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d   assert( eType!=
34550 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
34560 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
34570 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46   eType!=PTRMAP_F
34580 52 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20  REEPAGE );.     
34590 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
345a0 67 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65  ge(pBt, pRoot, e
345b0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
345c0 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  pgnoMove, 0);.  
345d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
345e0 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pRoot);..      /
345f0 2a 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67  * Obtain the pag
34600 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f  e at pgnoRoot */
34610 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34630 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
34650 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
34660 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52  tPage(pBt, pgnoR
34670 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b  oot, &pRoot, 0);
34680 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
346a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
346b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
346c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
346d0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
346e0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
346f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34700 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34710 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
34720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34730 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34740 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  {.      pRoot = 
34750 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d  pPageMove;.    }
34760 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65   ..    /* Update
34770 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34780 20 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77   and meta-data w
34790 69 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74  ith the new root
347a0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f  -page number. */
347b0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
347c0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Put(pBt, pgnoRoo
347d0 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  t, PTRMAP_ROOTPA
347e0 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
347f0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
34800 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
34810 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34820 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
34830 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
34840 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e  teMeta(p, 4, pgn
34850 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20  oRoot);.    if( 
34860 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  rc ){.      rele
34870 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
34880 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34890 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
348a0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
348b0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
348c0 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
348d0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  ot, 1, 0);.    i
348e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
348f0 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
34900 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34910 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34920 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20  pRoot->pDbPage) 
34930 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  );.  zeroPage(pR
34940 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46  oot, flags | PTF
34950 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65  _LEAF);.  sqlite
34960 33 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f  3PagerUnref(pRoo
34970 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  t->pDbPage);.  *
34980 70 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70  piTable = (int)p
34990 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72  gnoRoot;.  retur
349a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
349b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
349c0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
349d0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
349e0 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
349f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
34a00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
34a10 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65  .  rc = btreeCre
34a20 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61  ateTable(p, piTa
34a30 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73  ble, flags);.  s
34a40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34a50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
34a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
34a70 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
34a80 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  ase page and all
34a90 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20   its children.  
34aa0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61  Return.** the pa
34ab0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
34ac0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
34ad0 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  t clearDatabaseP
34ae0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
34af0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
34b00 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61  /* The BTree tha
34b10 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
34b20 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  able */.  Pgno p
34b30 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
34b40 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
34b50 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 69 6e 74  o clear */.  int
34b60 20 66 72 65 65 50 61 67 65 46 6c 61 67 2c 20 20   freePageFlag,  
34b70 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
34b80 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
34b90 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65  .  int *pnChange
34ba0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
34bb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
34bc0 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
34bd0 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
34be0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
34bf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
34c00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
34c10 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
34c20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
34c30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
34c40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34c50 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
34c60 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
34c70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
34c80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
34c90 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
34ca0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
34cb0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
34cc0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
34cd0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
34ce0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
34cf0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
34d00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
34d10 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
34d20 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
34d30 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  ell), 1, pnChang
34d40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
34d50 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
34d60 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
34d70 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
34d80 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
34d90 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
34da0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
34db0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
34dc0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
34dd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
34de0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
34df0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
34e00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
34e10 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68 61 6e 67  [8]), 1, pnChang
34e20 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
34e30 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
34e40 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
34e50 65 6c 73 65 20 69 66 28 20 70 6e 43 68 61 6e 67  else if( pnChang
34e60 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
34e70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
34e80 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e 67 65 20  ;.    *pnChange 
34e90 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b  += pPage->nCell;
34ea0 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50  .  }.  if( freeP
34eb0 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  ageFlag ){.    r
34ec0 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
34ed0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ge);.  }else if(
34ee0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
34ef0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
34f00 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a  pDbPage))==0 ){.
34f10 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
34f20 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ge, pPage->aData
34f30 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  [0] | PTF_LEAF);
34f40 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62  .  }..cleardatab
34f50 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72  asepage_out:.  r
34f60 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
34f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
34f80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
34f90 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
34fa0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61  from a single ta
34fb0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
34fc0 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a  ase.  iTable is.
34fd0 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
34fe0 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f  er of the root o
34ff0 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66  f the table.  Af
35000 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
35010 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65   returns,.** the
35020 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d   root page is em
35030 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65  pty, but still e
35040 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  xists..**.** Thi
35050 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66  s routine will f
35060 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ail with SQLITE_
35070 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20  LOCKED if there 
35080 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20  are any open.** 
35090 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20  read cursors on 
350a0 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e  the table.  Open
350b0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
350c0 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
350d0 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  ** root of the t
350e0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  able..**.** If p
350f0 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f 74 20 4e  nChange is not N
35100 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62 6c 65 20  ULL, then table 
35110 69 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61  iTable must be a
35120 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2e 20  n intkey table. 
35130 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 76  The.** integer v
35140 61 6c 75 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  alue pointed to 
35150 62 79 20 70 6e 43 68 61 6e 67 65 20 69 73 20 69  by pnChange is i
35160 6e 63 72 65 6d 65 6e 74 65 64 20 62 79 20 74 68  ncremented by th
35170 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
35180 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 74 61  ntries in the ta
35190 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
351a0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
351b0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
351c0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 6e   iTable, int *pn
351d0 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e 74 20 72  Change){.  int r
351e0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
351f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
35200 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
35210 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
35220 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
35230 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
35240 28 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65  (rc = checkForRe
35250 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
35260 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53  Table, 0, 1))!=S
35270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35280 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
35290 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
352a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
352b0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
352c0 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29  pBt, iTable, 0))
352d0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
352e0 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
352f0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  lse{.    rc = cl
35300 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
35310 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
35320 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b  e, 0, pnChange);
35330 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
35340 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
35350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35360 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66  ** Erase all inf
35370 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61  ormation in a ta
35380 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68 65 20  ble and add the 
35390 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
353a0 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65  e to.** the free
353b0 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74  list.  Except, t
353c0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70  he root of the p
353d0 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28  rinciple table (
353e0 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61  the one on.** pa
353f0 67 65 20 31 29 20 69 73 20 6e 65 76 65 72 20 61  ge 1) is never a
35400 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
35410 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  list..**.** This
35420 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
35430 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
35440 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
35450 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63  re any open.** c
35460 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61  ursors on the ta
35470 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55  ble..**.** If AU
35480 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62  TOVACUUM is enab
35490 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  led and the page
354a0 20 61 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f   at iTable is no
354b0 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f  t the last.** ro
354c0 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ot page in the d
354d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
354e0 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  en the last root
354f0 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65   page .** in the
35500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
35510 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65  s moved into the
35520 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
35530 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54  ccupied by.** iT
35540 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61  able and that la
35550 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  st slot formerly
35560 20 6f 63 63 75 70 69 65 64 20 62 79 20 74 68 65   occupied by the
35570 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a   last root page.
35580 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
35590 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74  he freelist inst
355a0 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20  ead of iTable.  
355b0 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c  In this say, all
355c0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61  .** root pages a
355d0 72 65 20 6b 65 70 74 20 61 74 20 74 68 65 20 62  re kept at the b
355e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
355f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
35600 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73  hich.** is neces
35610 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43  sary for AUTOVAC
35620 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68  UUM to work righ
35630 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  t.  *piMoved is 
35640 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70  set to the .** p
35650 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
35660 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  used to be the l
35670 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ast root page in
35680 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
35690 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49  .** the move.  I
356a0 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d  f no page gets m
356b0 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69  oved, *piMoved i
356c0 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54  s set to 0..** T
356d0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
356e0 65 20 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e  e is recorded in
356f0 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65   meta[3] and the
35700 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74   value of.** met
35710 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65 64 20  a[3] is updated 
35720 62 79 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  by this procedur
35730 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
35740 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
35750 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
35760 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
35770 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
35780 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35790 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
357a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
357b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
357c0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
357d0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
357e0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
357f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
35800 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  /* It is illegal
35810 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
35820 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20   if any cursors 
35830 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
35840 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
35850 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
35860 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
35870 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d  de the backend m
35880 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20  ay.  ** need to 
35890 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f  move another roo
358a0 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61  t-page to fill a
358b0 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65   gap left by the
358c0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f   deleted.  ** ro
358d0 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f  ot page. If an o
358e0 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75  pen cursor was u
358f0 73 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61  sing this page a
35900 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a   problem would .
35910 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f    ** occur..  */
35920 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72  .  if( pBt->pCur
35930 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
35940 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
35950 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
35960 70 43 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d  pCursor->pBtree-
35970 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
35980 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
35990 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
359a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
359b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
359c0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26   (Pgno)iTable, &
359d0 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
359e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
359f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
35a00 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70  treeClearTable(p
35a10 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  , iTable, 0);.  
35a20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
35a30 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
35a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
35a50 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
35a60 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
35a70 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
35a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35a90 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
35aa0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
35ab0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
35ac0 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
35ad0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35ae0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
35af0 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
35b00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
35b10 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
35b20 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50  (p, 4, &maxRootP
35b30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
35b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35b50 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
35b60 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
35b70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
35b80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
35b90 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f  f( iTable==maxRo
35ba0 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  otPgno ){.      
35bb0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
35bc0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
35bd0 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  is the table wit
35be0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  h the largest ro
35bf0 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
35c00 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
35c10 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74   database, put t
35c20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20  he root page on 
35c30 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a  the free list. .
35c40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35c50 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
35c60 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
35c70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
35c80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
35c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
35cb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
35cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35cd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
35ce0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
35cf0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
35d00 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
35d10 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
35d20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
35d30 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20  tabase. So move 
35d40 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f  the page that do
35d50 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  es into the .   
35d60 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74       ** gap left
35d70 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20   by the deleted 
35d80 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20  root-page..     
35d90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65     */.        Me
35da0 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20  mPage *pMove;.  
35db0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35dc0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
35dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
35de0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
35df0 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
35e00 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
35e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
35e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
35e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
35e50 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
35e60 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
35e70 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
35e80 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
35e90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35ea0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
35eb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
35ed0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
35ee0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
35ef0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
35f00 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
35f10 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
35f20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35f40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35f50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
35f60 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
35f70 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
35f80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35f90 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
35fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35fb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
35fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
35fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d    }.        *piM
35fe0 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67  oved = maxRootPg
35ff0 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
36000 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65     /* Set the ne
36010 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65  w 'max-root-page
36020 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64  ' value in the d
36030 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20  atabase header. 
36040 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
36050 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c   the old value l
36060 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e  ess one, less on
36070 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68  e more if that h
36080 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20  appens to.      
36090 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67  ** be a root-pag
360a0 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f  e number, less o
360b0 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74  ne again if that
360c0 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
360d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
360e0 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  GE..      */.   
360f0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
36100 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  ;.      if( maxR
36110 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47  ootPgno==PENDING
36120 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
36130 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
36140 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
36150 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  }.      if( maxR
36160 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  ootPgno==PTRMAP_
36170 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52  PAGENO(pBt, maxR
36180 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  ootPgno) ){.    
36190 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
361a0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
361b0 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74   assert( maxRoot
361c0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
361d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
361e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
361f0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
36200 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  ta(p, 4, maxRoot
36210 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
36220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
36230 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
36240 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
36250 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
36260 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
36270 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
36280 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
36290 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
362a0 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
362b0 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
362c0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
362d0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
362e0 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
362f0 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
36300 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
36310 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
36320 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
36330 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
36340 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
36350 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
36360 20 20 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70    rc = btreeDrop
36370 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c  Table(p, iTable,
36380 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c   piMoved);.  sql
36390 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
363a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
363b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
363c0 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74  he meta-informat
363d0 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74  ion out of a dat
363e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74  abase file.  Met
363f0 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e  a[0].** is the n
36400 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
36410 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
36420 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
36430 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75  Meta[1].** throu
36440 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20  gh meta[15] are 
36450 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
36460 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79 65  e by higher laye
36470 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20  rs.  Meta[0].** 
36480 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68  is read-only, th
36490 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65 61  e others are rea
364a0 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20  d/write..** .** 
364b0 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72  The schema layer
364c0 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61   numbers meta va
364d0 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79  lues differently
364e0 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d 61  .  At the schema
364f0 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74  .** layer (and t
36500 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64  he SetCookie and
36510 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f   ReadCookie opco
36520 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20  des) the number 
36530 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73  of.** free pages
36540 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e   is not visible.
36550 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69    So Cookie[0] i
36560 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65  s the same as Me
36570 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ta[1]..*/.int sq
36580 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
36590 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
365a0 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29  idx, u32 *pMeta)
365b0 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
365c0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
365d0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
365e0 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61  ar *pP1;.  BtSha
365f0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
36600 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
36610 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 2f  eeEnter(p);..  /
36620 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74 61  * Reading a meta
36630 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71 75  -data value requ
36640 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
36650 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64 20   on page 1 (and 
36660 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 73  hence.  ** the s
36670 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
36680 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69 73  le. We grab this
36690 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73 73   lock regardless
366a0 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a 20   of whether or. 
366b0 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c 49   ** not the SQLI
366c0 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
366d0 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 28  ed flag is set (
366e0 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
366f0 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31 20   at page.  ** 1 
36700 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61 20  is treated as a 
36710 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79 20  special case by 
36720 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
36730 54 61 62 6c 65 4c 6f 63 6b 28 29 0a 20 20 2a 2a  TableLock().  **
36740 20 61 6e 64 20 73 65 74 53 68 61 72 65 64 43 61   and setSharedCa
36750 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e  cheTableLock()).
36760 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  .  */.  rc = que
36770 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
36780 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
36790 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
367a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
367b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
367c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
367d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
367e0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
367f0 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69  & idx<=15 );.  i
36800 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
36810 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
36820 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 68  ree is already h
36830 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
36840 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20  ce to page 1 of 
36850 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
36860 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69   ** file. In thi
36870 73 20 63 61 73 65 20 74 68 65 20 72 65 71 75 69  s case the requi
36880 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20 76 61  red meta-data va
36890 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61 64 20  lue can be read 
368a0 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a 20  directly.    ** 
368b0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 64 61  from the page da
368c0 74 61 20 6f 66 20 74 68 69 73 20 72 65 66 65 72  ta of this refer
368d0 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20 73 6c  ence. This is sl
368e0 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
368f0 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  an.    ** reques
36900 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66 65 72  ting a new refer
36910 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ence from the pa
36920 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a  ger layer..    *
36930 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  /.    pP1 = (uns
36940 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42 74  igned char *)pBt
36950 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
36960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
36970 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f 65 73   The b-tree does
36980 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 66 65   not have a refe
36990 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
369a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
369b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62 74  file..    ** Obt
369c0 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ain one from the
369d0 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20   pager layer..  
369e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
369f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
36a00 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70  t->pPager, 1, &p
36a10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
36a20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   rc ){.      sql
36a30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36a40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
36a50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
36a60 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
36a70 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
36a80 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
36a90 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61 20  );.  }.  *pMeta 
36aa0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
36ab0 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a 20  36 + idx*4]);.. 
36ac0 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65   /* If the b-tre
36ad0 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67  e is not holding
36ae0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
36af0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e 65  page 1, then one
36b00 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71 75 65   was .  ** reque
36b10 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  sted from the pa
36b20 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74 68 65  ger layer in the
36b30 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52 65   above block. Re
36b40 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
36b50 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  */.  if( !pBt->p
36b60 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73 71 6c  Page1 ){.    sql
36b70 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
36b80 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
36b90 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
36ba0 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
36bb0 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
36bc0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
36bd0 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
36be0 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
36bf0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
36c00 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
36c10 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
36c20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
36c30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
36c40 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
36c50 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
36c60 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
36c70 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  if..  /* If ther
36c80 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  e is currently a
36c90 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
36ca0 6f 6e 2c 20 67 72 61 62 20 61 20 72 65 61 64 2d  on, grab a read-
36cb0 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
36cc0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
36cd0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
36ce0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
36cf0 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 6e  sure that.  ** n
36d00 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
36d10 6f 6e 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68  on can modify th
36d20 65 20 6d 65 74 61 20 76 61 6c 75 65 20 6a 75 73  e meta value jus
36d30 74 20 72 65 61 64 20 66 72 6f 6d 0a 20 20 2a 2a  t read from.  **
36d40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 6e   the database un
36d50 74 69 6c 20 74 68 65 20 74 72 61 6e 73 61 63 74  til the transact
36d60 69 6f 6e 20 69 73 20 63 6f 6e 63 6c 75 64 65 64  ion is concluded
36d70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
36d80 69 6e 54 72 61 6e 73 3e 30 20 29 7b 0a 20 20 20  inTrans>0 ){.   
36d90 20 72 63 20 3d 20 73 65 74 53 68 61 72 65 64 43   rc = setSharedC
36da0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
36db0 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
36dc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
36dd0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
36de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
36df0 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66  * Write meta-inf
36e00 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e  ormation back in
36e10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
36e20 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20    Meta[0] is.** 
36e30 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61  read-only and ma
36e40 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  y not be written
36e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36e60 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
36e70 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
36e80 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20  x, u32 iMeta){. 
36e90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
36ea0 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
36eb0 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
36ec0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
36ed0 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78  t( idx>=1 && idx
36ee0 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  <=15 );.  sqlite
36ef0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
36f00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
36f10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
36f20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
36f30 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
36f40 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
36f50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72  age1->aData;.  r
36f60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36f70 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
36f80 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
36f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36fa0 20 29 7b 0a 20 20 20 20 70 75 74 34 62 79 74 65   ){.    put4byte
36fb0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
36fc0 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64  ], iMeta);.#ifnd
36fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
36fe0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
36ff0 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20  ( idx==7 ){.    
37000 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
37010 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65  utoVacuum || iMe
37020 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ta==0 );.      a
37030 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20  ssert( iMeta==0 
37040 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20  || iMeta==1 );. 
37050 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
37060 63 75 75 6d 20 3d 20 28 75 38 29 69 4d 65 74 61  cuum = (u8)iMeta
37070 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
37080 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
37090 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
370a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
370b0 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
370c0 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
370d0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
370e0 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
370f0 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
37100 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
37110 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37120 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
37130 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
37140 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
37150 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
37160 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
37170 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
37180 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73    ** restoreCurs
37190 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72  orPosition() her
371a0 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  e..  */.  MemPag
371b0 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74  e *pPage;.  rest
371c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
371d0 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65  n(pCur);.  pPage
371e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
371f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
37200 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
37210 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
37220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37230 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
37240 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43  ( pPage->pBt==pC
37250 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74  ur->pBt );.  ret
37260 75 72 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  urn pPage->aData
37270 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37280 74 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  t];.}..#ifndef S
37290 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
372a0 43 4f 55 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20  COUNT./*.** The 
372b0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
372c0 70 43 75 72 2c 20 69 73 20 61 20 63 75 72 73 6f  pCur, is a curso
372d0 72 20 6f 70 65 6e 65 64 20 6f 6e 20 73 6f 6d 65  r opened on some
372e0 20 62 2d 74 72 65 65 2e 20 43 6f 75 6e 74 20 74   b-tree. Count t
372f0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
37300 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 62  entries in the b
37310 2d 74 72 65 65 20 61 6e 64 20 77 72 69 74 65 20  -tree and write 
37320 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 2a 70  the result to *p
37330 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 51  nEntry..**.** SQ
37340 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
37350 6e 65 64 20 69 66 20 74 68 65 20 6f 70 65 72 61  ned if the opera
37360 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66  tion is successf
37370 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 20 0a  ully executed. .
37380 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
37390 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
373a0 6f 75 6e 74 65 72 65 64 20 28 69 2e 65 2e 20 61  ountered (i.e. a
373b0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 72 20 64 61  n IO error or da
373c0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
373d0 74 69 6f 6e 29 20 61 6e 20 53 51 4c 69 74 65 20  tion) an SQLite 
373e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
373f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
37400 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74  qlite3BtreeCount
37410 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
37420 20 69 36 34 20 2a 70 6e 45 6e 74 72 79 29 7b 0a   i64 *pnEntry){.
37430 20 20 69 36 34 20 6e 45 6e 74 72 79 20 3d 20 30    i64 nEntry = 0
37440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37450 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
37460 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70 6e  to return in *pn
37470 45 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72  Entry */.  int r
37480 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
37490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
374b0 2f 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  /.  rc = moveToR
374c0 6f 6f 74 28 70 43 75 72 29 3b 0a 0a 20 20 2f 2a  oot(pCur);..  /*
374d0 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72   Unless an error
374e0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 66 6f 6c   occurs, the fol
374f0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
37500 20 6f 6e 65 20 69 74 65 72 61 74 69 6f 6e 20 66   one iteration f
37510 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 70 61 67  or each.  ** pag
37520 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  e in the B-Tree 
37530 73 74 72 75 63 74 75 72 65 20 28 6e 6f 74 20 69  structure (not i
37540 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f  ncluding overflo
37550 77 20 70 61 67 65 73 29 2e 20 0a 20 20 2a 2f 0a  w pages). .  */.
37560 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
37570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
37580 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
37590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 69   /* Index of chi
375b0 6c 64 20 6e 6f 64 65 20 69 6e 20 70 61 72 65 6e  ld node in paren
375c0 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  t */.    MemPage
375d0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
375e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
375f0 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66 20 74  urrent page of t
37600 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  he b-tree */..  
37610 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
37620 61 20 6c 65 61 66 20 70 61 67 65 20 6f 72 20 74  a leaf page or t
37630 68 65 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61  he tree is not a
37640 6e 20 69 6e 74 2d 6b 65 79 20 74 72 65 65 2c 20  n int-key tree, 
37650 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 69  then .    ** thi
37660 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  s page contains 
37670 63 6f 75 6e 74 61 62 6c 65 20 65 6e 74 72 69 65  countable entrie
37680 73 2e 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  s. Increment the
37690 20 65 6e 74 72 79 20 63 6f 75 6e 74 65 72 0a 20   entry counter. 
376a0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c     ** accordingl
376b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  y..    */.    pP
376c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
376d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
376e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
376f0 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
37700 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
37710 6e 45 6e 74 72 79 20 2b 3d 20 70 50 61 67 65 2d  nEntry += pPage-
37720 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20  >nCell;.    }.. 
37730 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 61     /* pPage is a
37740 20 6c 65 61 66 20 6e 6f 64 65 2e 20 54 68 69 73   leaf node. This
37750 20 6c 6f 6f 70 20 6e 61 76 69 67 61 74 65 73 20   loop navigates 
37760 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
37770 61 74 20 69 74 20 0a 20 20 20 20 2a 2a 20 70 6f  at it .    ** po
37780 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
37790 74 20 69 6e 74 65 72 69 6f 72 20 63 65 6c 6c 20  t interior cell 
377a0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
377b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 0a  o the parent of.
377c0 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20      ** the next 
377d0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
377e0 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
377f0 74 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20  t been visited. 
37800 54 68 65 0a 20 20 20 20 2a 2a 20 70 43 75 72 2d  The.    ** pCur-
37810 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
37820 67 65 5d 20 76 61 6c 75 65 20 69 73 20 73 65 74  ge] value is set
37830 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
37840 20 74 68 65 20 70 61 72 65 6e 74 20 63 65 6c 6c   the parent cell
37850 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
37860 61 67 65 2c 20 6f 72 20 74 6f 20 74 68 65 20 6e  age, or to the n
37870 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
37880 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
37890 65 20 6e 65 78 74 20 70 61 67 65 0a 20 20 20 20  e next page.    
378a0 2a 2a 20 74 6f 20 76 69 73 69 74 20 69 73 20 74  ** to visit is t
378b0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
378c0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20  f its parent..  
378d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61    **.    ** If a
378e0 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
378f0 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20 76  tree have been v
37900 69 73 69 74 65 64 2c 20 72 65 74 75 72 6e 20 53  isited, return S
37910 51 4c 49 54 45 5f 4f 4b 20 74 6f 20 74 68 65 0a  QLITE_OK to the.
37920 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20      ** caller.. 
37930 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
37940 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
37950 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
37960 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
37970 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
37980 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6f 66 20  /* All pages of 
37990 74 68 65 20 62 2d 74 72 65 65 20 68 61 76 65 20  the b-tree have 
379a0 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20 52 65  been visited. Re
379b0 74 75 72 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  turn successfull
379c0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  y. */.          
379d0 2a 70 6e 45 6e 74 72 79 20 3d 20 6e 45 6e 74 72  *pnEntry = nEntr
379e0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  y;.          ret
379f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
37a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
37a20 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
37a30 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 20 28 20  .      }while ( 
37a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
37a50 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
37a60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
37a70 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  ge]->nCell );.. 
37a80 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
37a90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2b 2b 3b  [pCur->iPage]++;
37aa0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
37ab0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
37ac0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 0a  ->iPage];.    }.
37ad0 0a 20 20 20 20 2f 2a 20 44 65 73 63 65 6e 64 20  .    /* Descend 
37ae0 74 6f 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64  to the child nod
37af0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  e of the cell th
37b00 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 63 75  at the cursor cu
37b10 72 72 65 6e 74 6c 79 20 0a 20 20 20 20 2a 2a 20  rrently .    ** 
37b20 70 6f 69 6e 74 73 20 61 74 2e 20 54 68 69 73 20  points at. This 
37b30 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
37b40 6c 64 20 69 66 20 28 69 49 64 78 3d 3d 70 50 61  ld if (iIdx==pPa
37b50 67 65 2d 3e 6e 43 65 6c 6c 29 2e 0a 20 20 20 20  ge->nCell)..    
37b60 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d 20 70 43  */.    iIdx = pC
37b70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
37b80 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
37b90 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  iIdx==pPage->nCe
37ba0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ll ){.      rc =
37bb0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
37bc0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
37bd0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
37be0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
37bf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37c00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
37c10 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
37c20 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
37c30 2c 20 69 49 64 78 29 29 29 3b 0a 20 20 20 20 7d  , iIdx)));.    }
37c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 65 72  .  }..  /* An er
37c50 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
37c60 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
37c70 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 72 65 74  r code. */.  ret
37c80 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
37c90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
37ca0 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
37cb0 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
37cc0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
37cd0 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
37ce0 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
37cf0 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
37d00 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
37d10 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
37d20 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
37d30 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
37d40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37d50 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
37d60 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
37d70 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
37d80 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
37d90 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
37da0 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
37db0 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
37dc0 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
37dd0 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
37de0 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
37df0 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
37e00 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21  list ap;.  if( !
37e10 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20  pCheck->mxErr ) 
37e20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b  return;.  pCheck
37e30 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68  ->mxErr--;.  pCh
37e40 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76  eck->nErr++;.  v
37e50 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
37e60 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65  mat);.  if( pChe
37e70 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72  ck->errMsg.nChar
37e80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
37e90 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70  trAccumAppend(&p
37ea0 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22  Check->errMsg, "
37eb0 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69  \n", 1);.  }.  i
37ec0 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20  f( zMsg1 ){.    
37ed0 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
37ee0 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65  ppend(&pCheck->e
37ef0 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31  rrMsg, zMsg1, -1
37f00 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
37f10 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b  VXPrintf(&pCheck
37f20 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f  ->errMsg, 1, zFo
37f30 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
37f40 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70  end(ap);.  if( p
37f50 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61  Check->errMsg.ma
37f60 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
37f70 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63    pCheck->malloc
37f80 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
37f90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
37fa0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
37fb0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
37fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37fd0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
37fe0 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74  /*.** Add 1 to t
37ff0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
38000 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67  nt for page iPag
38010 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  e.  If this is t
38020 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66  he second.** ref
38030 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
38040 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ge, add an error
38050 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65   message to pChe
38060 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20  ck->zErrMsg..** 
38070 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72  Return 1 if ther
38080 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65  e are 2 ore more
38090 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
380a0 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66  he page and 0 if
380b0 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
380c0 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e  he first referen
380d0 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a  ce to the page..
380e0 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b  **.** Also check
380f0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
38100 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e  umber is in boun
38110 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ds..*/.static in
38120 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67  t checkRef(Integ
38130 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
38140 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68 61 72  Pgno iPage, char
38150 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69   *zContext){.  i
38160 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
38170 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50  turn 1;.  if( iP
38180 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67  age>pCheck->nPag
38190 65 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  e ){.    checkAp
381a0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
381b0 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c  zContext, "inval
381c0 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25  id page number %
381d0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
381e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
381f0 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65  if( pCheck->anRe
38200 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20  f[iPage]==1 ){. 
38210 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
38220 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
38230 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e  xt, "2nd referen
38240 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20  ce to page %d", 
38250 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
38260 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
38270 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52  rn  (pCheck->anR
38280 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a  ef[iPage]++)>1;.
38290 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
382a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
382b0 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  M./*.** Check th
382c0 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20  at the entry in 
382d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
382e0 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20  for page iChild 
382f0 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65  maps to .** page
38300 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65   iParent, pointe
38310 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20  r type ptrType. 
38320 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61  If not, append a
38330 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
38340 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f  ** to pCheck..*/
38350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
38360 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65  ckPtrmap(.  Inte
38370 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
38380 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20     /* Integrity 
38390 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f  check context */
383a0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
383b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69            /* Chi
383c0 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ld page number *
383d0 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
383e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
383f0 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
38400 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e  ap type */.  Pgn
38410 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20  o iParent,      
38420 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
38430 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65  pointer map pare
38440 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  nt page number *
38450 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  /.  char *zConte
38460 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  xt         /* Co
38470 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f  ntext descriptio
38480 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72