/ Hex Artifact Content
Login

Artifact 244dddea3a0550b033beb0aff11fbe063e6737d9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 38 31 20 32 30 30 39 2f 30  c,v 1.581 2009/0
0190: 33 2f 33 30 20 31 37 3a 31 39 3a 34 38 20 64 72  3/30 17:19:48 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 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
0cb0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
0cc0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
0cd0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
0ce0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
0cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
0d00: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
0d10: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
0d20: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
0d30: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
0d40: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
0d50: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
0d60: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
0d70: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
0d80: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
0d90: 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73  && pBt->isExclus
0da0: 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ive ){.    sqlit
0db0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
0dc0: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
0dd0: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
0de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0df0: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
0e00: 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  HE;.  }..  /* Th
0e10: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 73  is (along with s
0e20: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
0e30: 6c 65 4c 6f 63 6b 28 29 29 20 69 73 20 77 68 65  leLock()) is whe
0e40: 72 65 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64  re.  ** the Read
0e50: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
0e60: 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 2e 0a   is dealt with..
0e70: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
0e80: 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20 66  er is querying f
0e90: 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  or a read-lock o
0ea0: 6e 20 61 6e 79 20 74 61 62 6c 65 0a 20 20 2a 2a  n any table.  **
0eb0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
0ec0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
0ed0: 62 6c 65 20 28 74 61 62 6c 65 20 31 29 20 61 6e  ble (table 1) an
0ee0: 64 20 69 66 20 74 68 65 20 52 65 61 64 55 6e 63  d if the ReadUnc
0ef0: 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 6c  ommitted.  ** fl
0f00: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0f10: 74 68 65 20 6c 6f 63 6b 20 67 72 61 6e 74 65 64  the lock granted
0f20: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
0f30: 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20  re write-locks. 
0f40: 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   ** on the table
0f50: 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  . If a write-loc
0f60: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
0f70: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
0f80: 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  ted flag.  ** is
0f90: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
0fa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75  .  **.  ** In fu
0fb0: 6e 63 74 69 6f 6e 20 73 65 74 53 68 61 72 65 64  nction setShared
0fc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0fd0: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
0fe0: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
0ff0: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
1000: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1010: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
1020: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1030: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
1040: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
1050: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
1060: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
1070: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
1080: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
1090: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
10a0: 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d 73 63  s.  ** on non-sc
10b0: 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f 20 6e  hema tables do n
10c0: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
10d0: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
10e0: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  . The locking.  
10f0: 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72  ** procedure for
1100: 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1110: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
1120: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
1130: 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67   0==(p->db->flag
1140: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1150: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
1160: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
1170: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
1180: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1190: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
11a0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
11b0: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
11c0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
11d0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
11e0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
11f0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
1200: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
1210: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
1220: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
1230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
1240: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1250: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74  ocked(p->db, pIt
1260: 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b  er->pBtree->db);
1270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f  .        if( eLo
1280: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
1290: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
12a0: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
12b0: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ter );.         
12c0: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
12d0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
12e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12f0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1300: 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d  EDCACHE;.      }
1310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1330: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1360: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1370: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1380: 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  Add a lock on th
1390: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
13a0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f  t-page iTable to
13b0: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
13c0: 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72  e used.** by Btr
13d0: 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72  ee handle p. Par
13e0: 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73  ameter eLock mus
13f0: 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44  t be either READ
1400: 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49  _LOCK or .** WRI
1410: 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  TE_LOCK..**.** S
1420: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1430: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
1440: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
1450: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42  sfully. SQLITE_B
1460: 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  USY and.** SQLIT
1470: 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f  E_NOMEM may also
1480: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   be returned..*/
1490: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
14a0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
14b0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
14c0: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
14d0: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
14e0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14f0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
1500: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
1510: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
1520: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1530: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1540: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1550: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
1560: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
1570: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
1580: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  !=0 );..  /* Thi
1590: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
15a0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
15b0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
15c0: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
15d0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
15e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15f0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
1600: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
1610: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1620: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
1630: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
1640: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1650: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
1660: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
1670: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 20 6f  k is requested o
1680: 6e 0a 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68  n.  ** a non-sch
1690: 65 6d 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ema table, then 
16a0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  the lock is alwa
16b0: 79 73 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74  ys granted.  Ret
16c0: 75 72 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77  urn early.  ** w
16d0: 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e  ithout adding an
16e0: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74   entry to the Bt
16f0: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
1700: 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d  t. See.  ** comm
1710: 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ent in function 
1720: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1730: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20  TableLock() for 
1740: 6d 6f 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f  more info.  ** o
1750: 6e 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52  n handling the R
1760: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
1770: 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lag..  */.  if( 
1780: 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61  .    (p->db->fla
1790: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
17a0: 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20  committed) && . 
17b0: 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f     (eLock==READ_
17c0: 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61  LOCK) &&.    iTa
17d0: 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  ble!=MASTER_ROOT
17e0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
17f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1800: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
1810: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
1820: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
1830: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
1840: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
1850: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1860: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1870: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1880: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
1890: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
18a0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
18b0: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
18c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
18e0: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
18f0: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
1900: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
1910: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
1920: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
1930: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
1940: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
1950: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
1960: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
1970: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
1980: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
1990: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
19a0: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
19b0: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
19c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19e0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
19f0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
1a00: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
1a10: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
1a20: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1a30: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
1a40: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
1a50: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1a60: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
1a70: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
1a80: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
1a90: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
1aa0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
1ab0: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
1ac0: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
1ad0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
1ae0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
1af0: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
1b00: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
1b10: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
1b20: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
1b30: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
1b40: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
1b50: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
1b60: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
1b70: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
1b80: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
1b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ba0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1bb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1bc0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1be0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1bf0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
1c00: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
1c10: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
1c20: 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68  a calls to.** th
1c30: 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  e setSharedCache
1c40: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63  TableLock() proc
1c50: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
1c60: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
1c70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
1c80: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1c90: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
1ca0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1cb0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1cc0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
1cd0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
1ce0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1cf0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1d00: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
1d20: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
1d30: 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74  ..  while( *ppIt
1d40: 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  er ){.    BtLock
1d50: 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65   *pLock = *ppIte
1d60: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
1d70: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d  Bt->isExclusive=
1d80: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
1d90: 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  er==pLock->pBtre
1da0: 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  e );.    if( pLo
1db0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
1dc0: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
1dd0: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
1de0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1df0: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65  e(pLock);.    }e
1e00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65  lse{.      ppIte
1e10: 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78  r = &pLock->pNex
1e20: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
1e30: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50  assert( pBt->isP
1e40: 65 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74  ending==0 || pBt
1e50: 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69  ->pWriter );.  i
1e60: 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  f( pBt->pWriter=
1e70: 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  =p ){.    pBt->p
1e80: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
1e90: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
1ea0: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
1eb0: 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20  sPending = 0;.  
1ec0: 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e  }else if( pBt->n
1ed0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29  Transaction==2 )
1ee0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75  {.    /* This fu
1ef0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f00: 20 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e   when connection
1f10: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
1f20: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
1f30: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
1f40: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
1f50: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
1f60: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
1f70: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
1f80: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
1f90: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1fa0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1fb0: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
1fc0: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
1fd0: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
1fe0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
1ff0: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
2000: 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c  the isPending fl
2010: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
2020: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2030: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
2040: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
2050: 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69  BtShared.isPendi
2060: 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ng must.    ** b
2070: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
2080: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
2090: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
20a0: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
20b0: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  */.    pBt->isPe
20c0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d  nding = 0;.  }.}
20d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
20e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
20f0: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
2100: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
2110: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
2120: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
2130: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
2140: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
2150: 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20   cursor holds a 
2160: 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2170: 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66  hared.*/.#ifndef
2180: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
2190: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
21a0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
21b0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
21c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
21d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
21e0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
21f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2200: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  RBLOB./*.** Inva
2210: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
2220: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
2230: 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70  che for cursor p
2240: 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  Cur, if any..*/.
2250: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
2260: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
2270: 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  che(BtCursor *pC
2280: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
2290: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22a0: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
22b0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
22c0: 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72  verflow);.  pCur
22d0: 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->aOverflow = 0;
22e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  .}../*.** Invali
22f0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
2300: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
2310: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
2320: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
2330: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
2340: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
2350: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
2360: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
2370: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
2380: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
2390: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
23a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23b0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
23c0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
23d0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
23e0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
23f0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
2400: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
2410: 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
2420: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
2430: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
2440: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
2450: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
2460: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
2470: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
2480: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
2490: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
24a0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
24b0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
24c0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
24d0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
24e0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
24f0: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
2500: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
2510: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
2520: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
2530: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
2540: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
2550: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
2560: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
2570: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
2580: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
2590: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
25a0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
25b0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
25c0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
25d0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
25e0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
25f0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
2600: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2610: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
2620: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
2630: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
2640: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
2650: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
2660: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
2670: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
2680: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
2690: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
26a0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
26b0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
26c0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
26d0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
26e0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
26f0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
2700: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
2710: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
2720: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
2730: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
2740: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2750: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
2760: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2770: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
2780: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
2790: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
27a0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
27b0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
27c0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
27d0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
27e0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
27f0: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
2800: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
2810: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
2820: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
2830: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
2840: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
2850: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
2860: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
2870: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
2880: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
2890: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
28a0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
28b0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
28c0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
28d0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
28e0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
28f0: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
2900: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
2910: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
2920: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
2930: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
2940: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2950: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
2960: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
2970: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
2980: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
2990: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
29a0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
29b0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
29c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
29d0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
29e0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
29f0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
2a00: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
2a10: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
2a20: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
2a30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
2a40: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
2a50: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
2a60: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
2a70: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
2a80: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
2a90: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
2aa0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
2ab0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
2ac0: 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20 69 66  e is ommitted if
2ad0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2ae0: 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64  ng bit is alread
2af0: 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68  y.** set in BtSh
2b00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
2b10: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
2b20: 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65  f the bitvec are
2b30: 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74   cleared.** at t
2b40: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
2b50: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
2b60: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2b70: 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  SetHasContent(Bt
2b80: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2b90: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  o pgno){.  int r
2ba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2bb0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
2bc0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  ontent ){.    in
2bd0: 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20  t nPage;.    rc 
2be0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
2bf0: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
2c00: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2c10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74  _OK ){.      pBt
2c30: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
2c40: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
2c50: 61 74 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b  ate((u32)nPage);
2c60: 0a 20 20 20 20 20 20 69 66 28 20 21 70 42 74 2d  .      if( !pBt-
2c70: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
2c80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2ca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2cb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cc0: 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65   && pgno<=sqlite
2cd0: 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d  3BitvecSize(pBt-
2ce0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b  >pHasContent) ){
2cf0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d00: 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e  3BitvecSet(pBt->
2d10: 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e  pHasContent, pgn
2d20: 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2d30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75   rc;.}../*.** Qu
2d40: 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64  ery the BtShared
2d50: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63  .pHasContent vec
2d60: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tor..**.** This 
2d70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d80: 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c  ed when a free-l
2d90: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
2da0: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2db0: 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66  e.** free-list f
2dc0: 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74  or reuse. It ret
2dd0: 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74  urns false if it
2de0: 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72   is safe to retr
2df0: 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ieve the.** page
2e00: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
2e10: 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
2e20: 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
2e30: 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72   set. True other
2e40: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
2e50: 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43  int btreeGetHasC
2e60: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
2e70: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
2e80: 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20  {.  Bitvec *p = 
2e90: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
2ea0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
2eb0: 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69   (pgno>sqlite3Bi
2ec0: 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73  tvecSize(p) || s
2ed0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2ee0: 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a  (p, pgno)));.}..
2ef0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73  /*.** Clear (des
2f00: 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72  troy) the BtShar
2f10: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
2f20: 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75  itvec. This shou
2f30: 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ld be.** invoked
2f40: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
2f50: 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65  on of each write
2f60: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f  -transaction..*/
2f70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
2f80: 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
2f90: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
2fa0: 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
2fb0: 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48  cDestroy(pBt->pH
2fc0: 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42  asContent);.  pB
2fd0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d  t->pHasContent =
2fe0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76   0;.}../*.** Sav
2ff0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
3000: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
3010: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
3020: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
3030: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
3040: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
3050: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
3060: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
3070: 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  EEK..*/.static i
3080: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
3090: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
30a0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
30b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
30c0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
30d0: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
30e0: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
30f0: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
3100: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3110: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
3120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
3130: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
3140: 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49  ->nKey);..  /* I
3150: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
3160: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
3170: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
3180: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
3190: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
31a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
31b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
31c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
31d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
31e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
31f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
3200: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
3210: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
3220: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
3230: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
3240: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
3250: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
3260: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
3270: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
3280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
3290: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
32a0: 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76  ->intKey){.    v
32b0: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
32c0: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
32d0: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
32e0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
32f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3300: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
3310: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
3320: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
3330: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3340: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
3350: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
3360: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3370: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3380: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
3390: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
33b0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
33c0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
33d0: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
33e0: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
33f0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
3400: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
3410: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
3420: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
3430: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
3440: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
3450: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
3460: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
3470: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
3480: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
3490: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
34a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
34b0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
34c0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
34d0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
34e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34f0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
3500: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
3510: 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70 74  l cursors except
3520: 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e   pExcept open on
3530: 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77   the table .** w
3540: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
3550: 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68  oot. Usually, th
3560: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  is is called jus
3570: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a  t before cursor.
3580: 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75 73  ** pExcept is us
3590: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
35a0: 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c   table (BtreeDel
35b0: 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e  ete() or BtreeIn
35c0: 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  sert())..*/.stat
35d0: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
35e0: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
35f0: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
3600: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
3610: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
3620: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
3630: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3640: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
3650: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
3660: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
3670: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
3680: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3690: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
36a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
36b0: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
36c0: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
36d0: 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20  t==iRoot) && .  
36e0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
36f0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
3700: 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
3710: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
3720: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  on(p);.      if(
3730: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
3740: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3750: 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
3760: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3770: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
3780: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
3790: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
37a0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
37b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
37c0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
37d0: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
37e0: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
37f0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
3800: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
3810: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
3820: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
3830: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3840: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
3850: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
3860: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
3870: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
3880: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
3890: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
38a0: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
38b0: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
38c0: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
38d0: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
38e0: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
38f0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
3900: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
3910: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
3920: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
3930: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
3940: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
3950: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
3960: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
3970: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
3980: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  sition()..*/.int
3990: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
39a0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
39b0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
39c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
39d0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
39e0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
3a00: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
3a10: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
3a20: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
3a30: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
3a40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
3a50: 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
3a60: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
3a70: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3a80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
3a90: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
3aa0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
3ab0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72  ->nKey, 0, &pCur
3ac0: 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72  ->skip);.  if( r
3ad0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3ae0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3af0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
3b00: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
3b10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
3b20: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
3b30: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
3b40: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
3b50: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a  _INVALID );.  }.
3b60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3b70: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43  #define restoreC
3b80: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
3b90: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
3ba0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
3bb0: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
3bc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73   sqlite3BtreeRes
3bd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
3be0: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
3bf0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
3c00: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
3c10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
3c20: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
3c30: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
3c40: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
3c50: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
3c60: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
3c70: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
3c80: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
3c90: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
3ca0: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
3cb0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
3cc0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
3cd0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
3ce0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
3cf0: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
3d00: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
3d10: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
3d20: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
3d30: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
3d40: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
3d50: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
3d60: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
3d70: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
3d80: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
3d90: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
3da0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
3db0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
3dc0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
3dd0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
3de0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
3df0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
3e00: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
3e10: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
3e20: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
3e30: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
3e40: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
3e50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
3e60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
3e70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
3e80: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
3e90: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
3ea0: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
3eb0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
3ec0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
3ed0: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
3ee0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
3ef0: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
3f00: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
3f10: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
3f20: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
3f30: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
3f40: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
3f50: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
3f60: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
3f70: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
3f80: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
3f90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3fa0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
3fb0: 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65  utex) );.  nPage
3fc0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
3fd0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
3fe0: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
3ff0: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
4000: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
4010: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
4020: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
4030: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
4040: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
4050: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
4060: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
4070: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
4080: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
4090: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
40a0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
40b0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
40c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
40d0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
40e0: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
40f0: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
4100: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
4110: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
4120: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
4130: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
4140: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
4150: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4160: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
4170: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
4180: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
4190: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
41a0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
41b0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
41c0: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
41d0: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
41e0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
41f0: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
4200: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
4210: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
4220: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
4230: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
4240: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
4250: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
4260: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
4270: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
4280: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
4290: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
42a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
42b0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
42c0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
42d0: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
42e0: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
42f0: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
4300: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
4310: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
4320: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
4330: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
4340: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
4350: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
4360: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
4370: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72   key==0 ){.    r
4380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
4390: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
43a0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
43b0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
43c0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
43d0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
43e0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
43f0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
4400: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4410: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
4420: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
4430: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
4440: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
4450: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
4460: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
4470: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
4480: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
4490: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
44a0: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
44b0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
44c0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
44d0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
44e0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
44f0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
4500: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72   parent));.    r
4510: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
4520: 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
4530: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4540: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4550: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d  Ptrmap[offset] =
4560: 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75   eType;.      pu
4570: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
4580: 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e  offset+1], paren
4590: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
45a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
45b0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72  ef(pDbPage);.  r
45c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
45d0: 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79  ** Read an entry
45e0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65   from the pointe
45f0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
4600: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65  s routine retrie
4610: 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ves the pointer 
4620: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
4630: 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e  ge 'key', writin
4640: 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e  g.** the type an
4650: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
4660: 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20  mber to *pEType 
4670: 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65  and *pPgno respe
4680: 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65  ctively..** An e
4690: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
46a0: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
46b0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
46c0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
46d0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
46e0: 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68  t ptrmapGet(BtSh
46f0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4700: 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c  key, u8 *pEType,
4710: 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20   Pgno *pPgno){. 
4720: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
4730: 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  ;   /* The point
4740: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
4750: 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20   int iPtrmap;   
4760: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
4770: 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f  ap page index */
4780: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
4790: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
47a0: 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a   map page data *
47b0: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
47c0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
47d0: 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69   of entry in poi
47e0: 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e  nter map */.  in
47f0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4800: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4810: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
4820: 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20  );..  iPtrmap = 
4830: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
4840: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
4850: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
4860: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
4870: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
4880: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
4890: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
48a0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
48b0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
48c0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
48d0: 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50  );..  offset = P
48e0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
48f0: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
4900: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
4910: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
4920: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
4930: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
4940: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
4950: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
4960: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
4970: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
4980: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
4990: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
49a0: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
49b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
49c0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
49d0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
49e0: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
49f0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
4a00: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
4a10: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
4a20: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
4a30: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65  #define ptrmapGe
4a40: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
4a50: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
4a60: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a  trmapPutOvfl(y,z
4a70: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
4a80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
4a90: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
4aa0: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
4ab0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
4ac0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
4ad0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
4ae0: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
4af0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
4b00: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
4b10: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
4b20: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
4b30: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
4b40: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
4b50: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
4b60: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
4b70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
4b80: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
4b90: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
4ba0: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
4bb0: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61  t2byte(&(P)->aDa
4bc0: 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73  ta[(P)->cellOffs
4bd0: 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a  et+2*(I)])))../*
4be0: 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20  .** This a more 
4bf0: 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20  complex version 
4c00: 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68  of findCell() th
4c10: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
4c20: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
4c30: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
4c40: 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72  ells.  See inser
4c50: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  t.*/.static u8 *
4c60: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
4c70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4c80: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
4c90: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
4ca0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4cb0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4cc0: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
4cd0: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
4ce0: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
4cf0: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
4d00: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
4d10: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
4d20: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
4d30: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
4d40: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
4d50: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
4d60: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
4d70: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
4d80: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
4d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4da0: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
4db0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
4dc0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4dd0: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
4de0: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
4df0: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
4e00: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
4e10: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
4e20: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
4e30: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
4e40: 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65  unction.  sqlite
4e50: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
4e60: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
4e70: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
4e80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4e90: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
4ea0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a  ParseCellPtr() .
4eb0: 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  ** takes a point
4ec0: 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f  er to the body o
4ed0: 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74  f the cell as it
4ee0: 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  s second argumen
4ef0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20  t..**.** Within 
4f00: 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70  this file, the p
4f10: 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f  arseCell() macro
4f20: 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69   can be called i
4f30: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c  nstead of.** sql
4f40: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
4f50: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
4f60: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
4f70: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
4f80: 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
4f90: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4fa0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
4fb0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
4fc0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
4fd0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
4fe0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
4ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
5000: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
5010: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
5020: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
5030: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
5040: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
5050: 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20  ){.  u16 n;     
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5070: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
5080: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
5090: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
50a0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
50b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
50c0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
50d0: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
50e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
50f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5100: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
5110: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
5120: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
5130: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
5140: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
5150: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
5160: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
5170: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
5180: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
5190: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
51a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
51b0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
51c0: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
51d0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
51e0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d  nPayload);.    }
51f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79  else{.      nPay
5200: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  load = 0;.    }.
5210: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
5220: 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75  nt(&pCell[n], (u
5230: 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79  64*)&pInfo->nKey
5240: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  );.    pInfo->nD
5250: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
5260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
5270: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20  fo->nData = 0;. 
5280: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
5290: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
52a0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49  Payload);.    pI
52b0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
52c0: 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  load;.  }.  pInf
52d0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
52e0: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
52f0: 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20  >nHeader = n;.  
5300: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
5310: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
5320: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
5330: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
5340: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
5350: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
5360: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
5370: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
5380: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
5390: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
53a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
53b0: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
53c0: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
53d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
53e0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53   bytes */.    nS
53f0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
5400: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
5410: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
5420: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
5430: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
5440: 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20  .    if( (nSize 
5450: 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  & ~3)==0 ){.    
5460: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
5470: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
5480: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
5490: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
54a0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e  ->nSize = (u16)n
54b0: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
54c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
54d0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
54e0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
54f0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
5500: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
5510: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
5520: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
5530: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
5540: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
5550: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
5560: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
5570: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
5580: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
5590: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
55a0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
55b0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
55c0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
55d0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
55e0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
55f0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
5600: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
5610: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
5620: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
5630: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
5640: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
5650: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
5660: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
5670: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
5680: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
5690: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
56a0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
56b0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
56c0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
56d0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
56e0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
56f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
5700: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
5710: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
5720: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
5730: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
5740: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
5750: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
5760: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
5770: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
5780: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
5790: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
57a0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
57b0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
57c0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
57d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
57e0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
57f0: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
5800: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
5810: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
5820: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
5830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
5840: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
5850: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
5860: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
5870: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
5880: 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b  (pInfo->nLocal +
5890: 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e   n);.    pInfo->
58a0: 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69  nSize = pInfo->i
58b0: 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20  Overflow + 4;.  
58c0: 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73  }.}.#define pars
58d0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
58e0: 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73  ll, pInfo) \.  s
58f0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
5900: 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c  CellPtr((pPage),
5910: 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65   findCell((pPage
5920: 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49  ), (iCell)), (pI
5930: 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74  nfo)).void sqlit
5940: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
5950: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
5960: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
5970: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
5980: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
5990: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
59a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
59b0: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
59c0: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
59d0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
59e0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
59f0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
5a00: 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c  */.){.  parseCel
5a10: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
5a20: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
5a30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
5a40: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
5a50: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
5a60: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
5a70: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
5a80: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
5a90: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
5aa0: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
5ab0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
5ac0: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
5ad0: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
5ae0: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
5af0: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
5b00: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
5b10: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
5b20: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
5b30: 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  G.static u16 cel
5b40: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
5b50: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
5b60: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
5b70: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  o;.  sqlite3Btre
5b80: 65 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  eParseCell(pPage
5b90: 2c 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , iCell, &info);
5ba0: 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e  .  return info.n
5bb0: 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73  Size;.}.#endif.s
5bc0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
5bd0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
5be0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
5bf0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
5c00: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  o;.  sqlite3Btre
5c10: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
5c20: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
5c30: 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66  o);.  return inf
5c40: 6f 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e  o.nSize;.}..#ifn
5c50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5c60: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
5c70: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
5c80: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
5c90: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
5ca0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
5cb0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
5cc0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
5cd0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5ce0: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
5cf0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
5d00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5d10: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
5d20: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
5d30: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
5d40: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61  llInfo info;.  a
5d50: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
5d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
5d70: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
5d80: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
5d90: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
5da0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
5db0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
5dc0: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
5dd0: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28  yload );.  if( (
5de0: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
5df0: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
5e00: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
5e10: 63 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  cal ){.    Pgno 
5e20: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
5e30: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
5e40: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74  rflow]);.    ret
5e50: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50  urn ptrmapPut(pP
5e60: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
5e70: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
5e80: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
5e90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ea0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
5eb0: 49 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  If the cell with
5ec0: 20 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20   index iCell on 
5ed0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
5ee0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
5ef0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
5f00: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
5f10: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
5f20: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
5f30: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
5f40: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
5f50: 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  nt ptrmapPutOvfl
5f60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
5f70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75   int iCell){.  u
5f80: 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65  8 *pCell;.  asse
5f90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5fa0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
5fb0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
5fc0: 43 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66  Cell = findOverf
5fd0: 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  lowCell(pPage, i
5fe0: 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Cell);.  return 
5ff0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6000: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
6010: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
6020: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
6030: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
6040: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
6050: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
6060: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
6070: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
6080: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
6090: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
60a0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
60b0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
60c0: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
60d0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
60e0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
60f0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
6100: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
6110: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
6120: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
6150: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
6160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6170: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6180: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
6190: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61b0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
61c0: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
61d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
61e0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
6210: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
6220: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6240: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
6250: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
6260: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
6270: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
6280: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
6290: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
62a0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
62b0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
62c0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
62d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
62e0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
62f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6300: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
6310: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
6320: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
6330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6340: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
6350: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
6360: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6370: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
6380: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
6390: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
63a0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
63b0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
63c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
63d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
63e0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
63f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
6400: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6410: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
6420: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
6430: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
6440: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
6450: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
6460: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
6470: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
6480: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6490: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
64a0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
64b0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
64c0: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
64d0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
64e0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
64f0: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
6500: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
6510: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
6520: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
6530: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
6540: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
6550: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
6560: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
6570: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
6580: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
6590: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
65a0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
65b0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
65c0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
65d0: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
65e0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
65f0: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
6600: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28  ableSize;.  for(
6610: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
6620: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
6630: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
6640: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
6650: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
6660: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
6670: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
6680: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
6690: 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73  ;.    if( pc>=us
66a0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
66b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
66c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
66d0: 20 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63    }.    size = c
66e0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
66f0: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
6700: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
6710: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c      if( cbrk<cel
6720: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
6730: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
6740: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
6750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6760: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
6770: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
6780: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
6790: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b  ze && cbrk>=0 );
67a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
67b0: 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  a[cbrk], &temp[p
67c0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
67d0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
67e0: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
67f0: 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66  rt( cbrk>=cellOf
6800: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a  fset+2*nCell );.
6810: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6820: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
6830: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
6840: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
6850: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
6860: 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20  +7] = 0;.  addr 
6870: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  = cellOffset+2*n
6880: 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Cell;.  memset(&
6890: 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63  data[addr], 0, c
68a0: 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73  brk-addr);.  ass
68b0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
68c0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
68d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
68e0: 20 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21    if( cbrk-addr!
68f0: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
6900: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6910: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6930: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6940: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
6950: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
6960: 6f 6e 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  on a page..**.**
6970: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
6980: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
6990: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72  ata[] of the fir
69a0: 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68  st byte of.** th
69b0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
69c0: 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  .  The caller gu
69d0: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
69e0: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a  ere is enough.**
69f0: 20 73 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f   space.  This ro
6a00: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72  utine will never
6a10: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   fail..**.** If 
6a20: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
6a30: 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65  s nBytes of free
6a40: 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73 20   space but does 
6a50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e  not contain.** n
6a60: 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75  Bytes of contigu
6a70: 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c 20  ous free space, 
6a80: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
6a90: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  e automatically.
6aa0: 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67 6d  ** calls defragm
6ab0: 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e  entPage() to con
6ac0: 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65  solidate all fre
6ad0: 65 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a  e space before .
6ae0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68  ** allocating th
6af0: 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a  e new chunk..*/.
6b00: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
6b10: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
6b20: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
6b30: 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  te){.  int addr,
6b40: 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20   pc, hdr;.  int 
6b50: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61  size;.  int nFra
6b60: 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  g;.  int top;.  
6b70: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74  int nCell;.  int
6b80: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75   cellOffset;.  u
6b90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
6ba0: 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20  ta;.  .  data = 
6bb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
6bc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
6bd0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
6be0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6bf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6c00: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
6c10: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6c20: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
6c30: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6c40: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
6c50: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
6c60: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
6c70: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
6c80: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
6c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
6ca0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
6cb0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72   );.  pPage->nFr
6cc0: 65 65 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65  ee -= (u16)nByte
6cd0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
6ce0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e  >hdrOffset;..  n
6cf0: 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b  Frag = data[hdr+
6d00: 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c  7];.  if( nFrag<
6d10: 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61  60 ){.    /* Sea
6d20: 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  rch the freelist
6d30: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73   looking for a s
6d40: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
6d50: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20  o satisfy the.  
6d60: 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65    ** space reque
6d70: 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20  st. */.    addr 
6d80: 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69  = hdr+1;.    whi
6d90: 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79  le( (pc = get2by
6da0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
6db0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65  >0 ){.      size
6dc0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6dd0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
6de0: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
6df0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
6e00: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
6e10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a  .        if( siz
6e20: 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20  e<nByte+4 ){.   
6e30: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
6e40: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
6e50: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
6e60: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
6e70: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
6e80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
6e90: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
6ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6eb0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6ec0: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
6ed0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b       return pc +
6ee0: 20 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   x;.        }.  
6ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72      }.      addr
6f00: 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pc;.    }.  }
6f10: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
6f20: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
6f30: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
6f40: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
6f50: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
6f60: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
6f70: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
6f80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6f90: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65  a[hdr+5]);.  nCe
6fa0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
6fb0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63  ata[hdr+3]);.  c
6fc0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
6fd0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
6fe0: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c   if( nFrag>=60 |
6ff0: 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  | cellOffset + 2
7000: 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e  *nCell > top - n
7010: 42 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72  Byte ){.    defr
7020: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
7030: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
7040: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7050: 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d  5]);.  }.  top -
7060: 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  = nByte;.  asser
7070: 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  t( cellOffset + 
7080: 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29  2*nCell <= top )
7090: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
70a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
70b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
70c0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
70d0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
70e0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 74  e) );.  return t
70f0: 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  op;.}../*.** Ret
7100: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
7110: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
7120: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
7130: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
7140: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
7150: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
7160: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
7170: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
7180: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
7190: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
71a0: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
71b0: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
71c0: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
71d0: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
71e0: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
71f0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
7200: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
7210: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
7220: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
7230: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
7240: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
7250: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
7260: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
7270: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
7280: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
7290: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
72a0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
72b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
72c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
72d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
72e0: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
72f0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
7300: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
7310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
7320: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
7330: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
7340: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
7350: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7360: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7370: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
7380: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
7390: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
73a0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
73b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
73c0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
73d0: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
73e0: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
73f0: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
7400: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
7410: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
7420: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
7430: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
7440: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
7450: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
7460: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
7470: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
7480: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
7490: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
74a0: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
74b0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
74c0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
74d0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
74e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
74f0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
7500: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
7510: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
7520: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
7530: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
7540: 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64    if( pbegin<=ad
7550: 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74  dr ) {.      ret
7560: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7570: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
7580: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
7590: 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65  ;.  }.  if ( pbe
75a0: 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  gin>pPage->pBt->
75b0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b  usableSize-4 ) {
75c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
75d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
75e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
75f0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
7600: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
7610: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
7620: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
7630: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
7640: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
7650: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
7660: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
7670: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
7680: 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f   (u16)size;..  /
7690: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
76a0: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
76b0: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67  */.  addr = pPag
76c0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31  e->hdrOffset + 1
76d0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
76e0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
76f0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
7700: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
7710: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
7720: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
7730: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
7740: 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e   pbegin<=pPage->
7750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7760: 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d  4 );.    pnext =
7770: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
7780: 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73  pbegin]);.    ps
7790: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
77a0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b  data[pbegin+2]);
77b0: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20  .    if( pbegin 
77c0: 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70  + psize + 3 >= p
77d0: 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20  next && pnext>0 
77e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61  ){.      int fra
77f0: 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65  g = pnext - (pbe
7800: 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20  gin+psize);.    
7810: 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c    if( (frag<0) |
7820: 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74  | (frag>(int)dat
7830: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
7840: 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  et+7]) ){.      
7850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7870: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
7880: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
7890: 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67  t+7] -= (u8)frag
78a0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
78b0: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
78c0: 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ]);.      put2by
78d0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
78e0: 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  , x);.      x = 
78f0: 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65  pnext + get2byte
7900: 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29  (&data[pnext+2])
7910: 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20   - pbegin;.     
7920: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
7930: 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20  pbegin+2], x);. 
7940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7950: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
7960: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7970: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
7980: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
7990: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
79a0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
79b0: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
79c0: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
79d0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
79e0: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
79f0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
7a00: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
7a10: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
7a20: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
7a30: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
7a40: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
7a50: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
7a60: 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65  ata[hdr+5]) + ge
7a70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
7a80: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74  gin+2]);.    put
7a90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7aa0: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20  5], top);.  }.  
7ab0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7ac0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
7ad0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7ae0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7af0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7b00: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
7b10: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
7b20: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
7b30: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
7b40: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
7b50: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
7b60: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
7b70: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
7b80: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
7b90: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
7ba0: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
7bb0: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
7bc0: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
7bd0: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
7be0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
7bf0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
7c00: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
7c10: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
7c20: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
7c30: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
7c40: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
7c50: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
7c60: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
7c70: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
7c80: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
7c90: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
7ca0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
7cb0: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
7cc0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
7cd0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
7ce0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
7cf0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
7d00: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
7d10: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
7d20: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
7d30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7d40: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7d50: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
7d60: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
7d70: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
7d80: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
7d90: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
7da0: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
7db0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
7dc0: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
7dd0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
7de0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
7df0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
7e00: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
7e10: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
7e20: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
7e30: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
7e40: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
7e50: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
7e60: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
7e70: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
7e80: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
7e90: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
7ea0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
7eb0: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
7ec0: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
7ed0: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
7ee0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
7ef0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
7f00: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
7f10: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
7f20: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
7f30: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
7f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
7f50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7f60: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
7f70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7f80: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
7f90: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
7fa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
7fb0: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
7fc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
7fd0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
7fe0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
7ff0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
8000: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
8010: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
8020: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
8030: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
8040: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
8050: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
8060: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
8070: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
8080: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
8090: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
80a0: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
80b0: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
80c0: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
80d0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69  corruption..*/.i
80e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
80f0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
8100: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
8110: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
8120: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8130: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8140: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8150: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
8160: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
8170: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
8180: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
8190: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
81a0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
81b0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
81c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
81d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
81e0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
81f0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8200: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
8210: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
8220: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
8230: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
8240: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8250: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
8260: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
8270: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
8280: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
8290: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
82a0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
82b0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
82c0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
82d0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
82e0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
82f0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
8300: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
8310: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
8320: 20 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62   */.    u16 usab
8330: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
8340: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
8350: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
8360: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
8370: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
8380: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
8390: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
83a0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
83b0: 2f 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b  /.    u16 nFree;
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
83d0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
83e0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
83f0: 2f 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20  /.    u16 top;  
8400: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8410: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
8420: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
8430: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
8440: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
8450: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8460: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
8470: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
8480: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
8490: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
84a0: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
84b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
84c0: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
84d0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
84e0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
84f0: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
8500: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
8510: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
8520: 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e - 1;.    pPage
8530: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
8540: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
8550: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
8560: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
8570: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
8580: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
8590: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
85a0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
85b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
85c0: 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ]);.    pPage->n
85d0: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
85e0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
85f0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
8600: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
8610: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
8620: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
8630: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
8640: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
8650: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
8660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8670: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8680: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d   }.  .    /* Com
8690: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
86a0: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
86b0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
86c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
86d0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
86e0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
86f0: 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f  ] + top - (cellO
8700: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
8710: 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69  >nCell);.    whi
8720: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
8730: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
8740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75  ;.      if( pc>u
8750: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
8760: 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62         /* Free b
8770: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
8780: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
8790: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
87a0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
87b0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
87c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
87d0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
87e0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
87f0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
8800: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
8810: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
8820: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
8830: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
8840: 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
8850: 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  der */.        r
8860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8870: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
8880: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
8890: 2b 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  += size;.      p
88a0: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
88b0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
88c0: 20 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a 20   = (u16)nFree;. 
88d0: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73     if( nFree>=us
88e0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
88f0: 20 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20    /* Free space 
8900: 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f  cannot exceed to
8910: 74 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  tal page size */
8920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8930: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8940: 54 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30  T; .    }..#if 0
8950: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
8960: 20 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73   all the offsets
8970: 20 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66   in the cell off
8980: 73 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69  set array are wi
8990: 74 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a  thin range. .  *
89a0: 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67  * .  ** Omitting
89b0: 20 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63   this consistenc
89c0: 79 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e  y check and usin
89d0: 67 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73  g the pPage->mas
89e0: 6b 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20  kPage mask.  ** 
89f0: 74 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72  to prevent overr
8a00: 75 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20  unning the page 
8a10: 62 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65  buffer in findCe
8a20: 6c 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20  ll() results in 
8a30: 61 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66  a.  ** 2.5% perf
8a40: 6f 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20  ormance gain..  
8a50: 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70  */.  {.    u8 *p
8a60: 4f 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49  Off;        /* I
8a70: 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
8a80: 63 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f  check all cell o
8a90: 66 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61  ffsets are in ra
8aa0: 6e 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70  nge */.    u8 *p
8ab0: 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50  End;        /* P
8ac0: 6f 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66  ointer to end of
8ad0: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
8ae0: 61 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73  ay */.    u8 mas
8af0: 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  k;         /* Ma
8b00: 73 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20  sk of bits that 
8b10: 6d 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20  must be zero in 
8b20: 4d 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73  MSB of cell offs
8b30: 65 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20  ets */.    mask 
8b40: 3d 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70  = ~(((u8)(pBt->p
8b50: 61 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b  ageSize>>8))-1);
8b60: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74  .    pEnd = &dat
8b70: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70  a[cellOffset + p
8b80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a  Page->nCell*2];.
8b90: 20 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61      for(pOff=&da
8ba0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
8bb0: 70 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28  pOff!=pEnd && !(
8bc0: 28 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70  (*pOff)&mask); p
8bd0: 4f 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28  Off+=2);.    if(
8be0: 20 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20   pOff!=pEnd ){. 
8bf0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8c00: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8c10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
8c20: 66 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  f..    pPage->is
8c30: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
8c40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
8c60: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
8c70: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
8c80: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
8c90: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
8ca0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
8cb0: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
8cc0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8cd0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
8ce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
8cf0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
8d00: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
8d10: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
8d20: 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
8d30: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8d40: 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
8d50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
8d60: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
8d70: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
8d80: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
8d90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8da0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
8db0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
8dc0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
8dd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8de0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8df0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
8e00: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
8e10: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
8e20: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
8e30: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
8e40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8e50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8e60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
8e70: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
8e80: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
8e90: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
8ea0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
8eb0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
8ec0: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
8ed0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
8ee0: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
8ef0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
8f00: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
8f10: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
8f20: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8f30: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
8f40: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
8f50: 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61  nFree = pBt->usa
8f60: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b  bleSize - first;
8f70: 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  .  decodeFlags(p
8f80: 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
8f90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
8fa0: 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d   = hdr;.  pPage-
8fb0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
8fc0: 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  rst;.  pPage->nO
8fd0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
8fe0: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
8ff0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
9000: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36  ->pageSize<=3276
9010: 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  8 );.  pPage->ma
9020: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
9030: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50  geSize - 1;.  pP
9040: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
9050: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
9060: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
9070: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
9080: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
9090: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
90a0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
90b0: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
90c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
90d0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
90e0: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
90f0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
9100: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
9110: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
9120: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
9130: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
9140: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
9150: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
9160: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
9170: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
9180: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
9190: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
91a0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
91b0: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
91c0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
91d0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
91e0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
91f0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
9200: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
9210: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
9220: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
9230: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
9240: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
9250: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
9260: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
9270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
9280: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
9290: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
92a0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
92b0: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
92c0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
92d0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
92e0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
92f0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
9300: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
9310: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
9320: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
9330: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
9340: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
9350: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
9360: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
9370: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
9380: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
9390: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
93a0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
93b0: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
93c0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
93d0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
93e0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
93f0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
9400: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
9410: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
9420: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
9430: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
9440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9450: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
9460: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
9470: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
9480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
9490: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
94a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
94b0: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
94c0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
94d0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
94e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
94f0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
9500: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
9510: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9520: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
9530: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9540: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
9550: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
9560: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
9570: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
9580: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9590: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
95a0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
95b0: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
95c0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
95d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
95e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
95f0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
9600: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
9610: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
9620: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
9630: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
9640: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
9650: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
9660: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
9670: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
9680: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
9690: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
96a0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
96b0: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
96c0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
96d0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
96e0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
96f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9700: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9710: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
9720: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
9730: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
9740: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
9750: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
9760: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
9770: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
9780: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
9790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
97a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
97b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
97c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
97d0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
97e0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
97f0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
9800: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
9810: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
9820: 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no pagerPagecoun
9830: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
9840: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20  {.  int nPage = 
9850: 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  -1;.  int rc;.  
9860: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
9870: 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ge1 );.  rc = sq
9880: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
9890: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
98a0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65   &nPage);.  asse
98b0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
98c0: 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29  K || nPage==-1 )
98d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f  ;.  return (Pgno
98e0: 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nPage;.}../*.**
98f0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
9900: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
9910: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
9920: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
9930: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
9940: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
9950: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
9960: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
9970: 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  BtreeGetPage() a
9980: 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nd sqlite3BtreeI
9990: 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  nitPage()..*/.st
99a0: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
99b0: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
99c0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
99d0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
99e0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
99f0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
9a00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
9a10: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
9a20: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
9a30: 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74  Page     /* Writ
9a40: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
9a50: 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  er here */.){.  
9a60: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
9a70: 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
9a80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9a90: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
9aa0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
9ab0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
9ac0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9ad0: 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20  T_BKPT; .  }..  
9ae0: 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74  /* It is often t
9af0: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
9b00: 20 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73   page we want is
9b10: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
9b20: 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67  e..  ** If so, g
9b30: 65 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20  et it directly. 
9b40: 20 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66   This saves us f
9b50: 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61  rom having to ca
9b60: 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67  ll.  ** pagerPag
9b70: 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65  ecount() to make
9b80: 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69   sure pgno is wi
9b90: 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69  thin limits, whi
9ba0: 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  ch results.  ** 
9bb0: 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  in a measureable
9bc0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
9bd0: 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  rovements..  */.
9be0: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
9bf0: 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
9c00: 6b 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a  kup(pBt, pgno);.
9c10: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
9c20: 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c     /* Page is al
9c30: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a  ready in cache *
9c40: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9c50: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
9c60: 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69     /* Page not i
9c70: 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72  n cache.  Acquir
9c80: 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
9c90: 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63   pgno>pagerPagec
9ca0: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
9cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9cc0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
9cd0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
9ce0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9cf0: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
9d00: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
9d10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
9d20: 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70  ;.    pPage = *p
9d30: 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  pPage;.  }.  if(
9d40: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
9d50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9d60: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
9d70: 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  (pPage);.  }.  i
9d80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9d90: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
9da0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9db0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
9dc0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9dd0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
9de0: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
9df0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
9e00: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
9e10: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
9e20: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
9e30: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
9e40: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
9e50: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
9e60: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
9e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e80: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
9e90: 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
9ea0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67  ageRefcount(pPag
9eb0: 65 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b  e->pDbPage)>1 );
9ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
9ed0: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
9ee0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9ef0: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
9f00: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
9f10: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
9f20: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
9f30: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
9f40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9f50: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
9f60: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
9f70: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
9f80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9f90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9fa0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9fc0: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
9fd0: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
9fe0: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
9ff0: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
a000: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
a010: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
a020: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
a030: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
a040: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
a050: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
a060: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
a070: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
a080: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
a090: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
a0a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
a0b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
a0c0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
a0d0: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
a0e0: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
a0f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
a100: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
a110: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
a120: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
a130: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
a140: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
a150: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
a160: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
a170: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
a180: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
a190: 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ata);.  if( pPag
a1a0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
a1b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a1c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a1d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a1e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
a1f0: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
a200: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
a210: 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
a220: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >0 ){.      /* p
a230: 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
a240: 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
a250: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
a260: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
a270: 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
a280: 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
a290: 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
a2a0: 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
a2b0: 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
a2c0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
a2d0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
a2e0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
a2f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
a300: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
a310: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
a320: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
a330: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
a340: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 73 71  that.      ** sq
a350: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
a360: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
a370: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
a380: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
a390: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
a3a0: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
a3b0: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
a3c0: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
a3d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a3e0: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
a3f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a400: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
a410: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
a420: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
a430: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
a440: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
a450: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
a460: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
a470: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
a480: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
a490: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
a4a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a4b0: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
a4c0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
a4d0: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
a4e0: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
a4f0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
a500: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
a510: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
a520: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
a530: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
a540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
a550: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
a560: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
a570: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
a580: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
a590: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
a5a0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
a5b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
a5c0: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
a5d0: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
a5e0: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
a5f0: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
a600: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
a610: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
a620: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
a630: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
a640: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
a650: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
a660: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
a670: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
a680: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
a690: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
a6a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
a6b0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
a6c0: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
a6d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
a6e0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
a6f0: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
a700: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
a710: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
a720: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
a730: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
a740: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
a750: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
a760: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
a770: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
a780: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
a790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
a7a0: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
a7b0: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
a7c0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
a7d0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
a7e0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fs;             
a7f0: 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73  /* The VFS to us
a800: 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65  e for this btree
a810: 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
a820: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
a830: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
a840: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
a850: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
a860: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
a870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
a880: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
a890: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
a8a0: 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
a8b0: 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
a8c0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
a8d0: 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
a8e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
a8f0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
a900: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
a910: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
a920: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
a930: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
a940: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
a950: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
a960: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
a970: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a980: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
a990: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
a9a0: 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
a9b0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
a9c0: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
a9d0: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
a9e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
a9f0: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
aa00: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
aa10: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
aa20: 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72  symbol is only r
aa30: 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20  equired if.  ** 
aa40: 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68  either of the sh
aa50: 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74  ared-data or aut
aa60: 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73  ovacuum features
aa70: 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20   are compiled . 
aa80: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62   ** into the lib
aa90: 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21  rary..  */.#if !
aaa0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
aab0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
aac0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
aad0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
aae0: 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53  CUUM).  #ifdef S
aaf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
ab00: 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  YDB.    const in
ab10: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20  t isMemdb = 0;. 
ab20: 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74   #else.    const
ab30: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a   int isMemdb = z
ab40: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72  Filename && !str
ab50: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
ab60: 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65  :memory:");.  #e
ab70: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ndif.#endif..  a
ab80: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
ab90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
aba0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
abb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56  >mutex) );..  pV
abc0: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
abd0: 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
abe0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
abf0: 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
ac00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
ac10: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
ac20: 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
ac30: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e  RANS_NONE;.  p->
ac40: 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64  db = db;..#if !d
ac50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
ac60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
ac70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
ac80: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
ac90: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
aca0: 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
acb0: 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
acc0: 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
acd0: 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
ace0: 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
acf0: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
ad00: 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
ad10: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  */.  if( isMemdb
ad20: 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66  ==0.   && (db->f
ad30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74  lags & SQLITE_Vt
ad40: 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69  ab)==0.   && zFi
ad50: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
ad60: 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20  ame[0].  ){.    
ad70: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
ad80: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
ad90: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
ada0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
adb0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
adc0: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
add0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
ade0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
adf0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ae00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
ae10: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
ae20: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
ae30: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
ae40: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c       db->flags |
ae50: 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43  = SQLITE_SharedC
ae60: 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20  ache;.      if( 
ae70: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
ae80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ae90: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
aea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
aeb0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
aed0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
aee0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
aef0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
af00: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
af10: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
af20: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
af30: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
af40: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
af50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
af60: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
af70: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
af80: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
af90: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
afa0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
afb0: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
afc0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
afd0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
afe0: 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
aff0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
b000: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
b010: 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
b020: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
b030: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
b040: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
b050: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
b060: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
b070: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
b080: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
b090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b0a0: 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
b0b0: 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
b0c0: 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
b0d0: 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
b0e0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
b0f0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
b100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b110: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b120: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
b130: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
b140: 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
b150: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
b160: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
b170: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
b180: 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
b190: 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
b1a0: 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
b1b0: 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
b1c0: 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
b1d0: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
b1e0: 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
b1f0: 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
b200: 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
b210: 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
b220: 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
b230: 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
b240: 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
b250: 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
b260: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
b270: 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
b280: 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
b290: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
b2a0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
b2b0: 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
b2c0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
b2d0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
b2e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
b2f0: 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
b300: 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
b310: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
b320: 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
b330: 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
b340: 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
b350: 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
b360: 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
b370: 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
b380: 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
b390: 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
b3a0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b3b0: 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
b3c0: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29  8 || sizeof(i64)
b3d0: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
b3e0: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
b3f0: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
b400: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
b410: 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
b420: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
b430: 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
b440: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
b450: 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
b460: 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
b470: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
b480: 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
b490: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
b4a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
b4b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b4c0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
b4d0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
b4e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
b4f0: 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70  gerOpen(pVfs, &p
b500: 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c  Bt->pPager, zFil
b510: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61   EXTRA_SIZE, fla
b540: 67 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20  gs, vfsFlags);. 
b550: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b560: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
b570: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
b580: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
b590: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
b5a0: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
b5b0: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
b5c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b5d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
b5e0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
b5f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b600: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
b610: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
b620: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
b630: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
b640: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
b650: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
b660: 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
b670: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
b680: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
b690: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
b6a0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
b6b0: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
b6c0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
b6d0: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
b6e0: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
b6f0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
b700: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
b710: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
b720: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
b730: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
b740: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
b750: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
b760: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
b770: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
b780: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
b790: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
b7a0: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  geSize = 0;.    
b7b0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
b7c0: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
b7d0: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
b7e0: 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20  eSize);.#ifndef 
b7f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b800: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
b810: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
b820: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
b830: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
b840: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
b850: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
b860: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
b870: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
b880: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
b890: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
b8a0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
b8b0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
b8c0: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
b8d0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
b8e0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
b8f0: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
b900: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
b910: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
b920: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
b930: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
b940: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
b950: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
b960: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
b970: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
b980: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
b990: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
b9a0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
b9b0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
b9c0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
b9d0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
b9e0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
b9f0: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
ba00: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ba10: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
ba20: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
ba30: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
ba40: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
ba50: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
ba60: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
ba70: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
ba80: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
ba90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
baa0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
bab0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
bac0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
bad0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
bae0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
baf0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
bb00: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
bb10: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
bb20: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
bb30: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  f.    }.    pBt-
bb40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
bb50: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52  t->pageSize - nR
bb60: 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65  eserve;.    asse
bb70: 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69  rt( (pBt->pageSi
bb80: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f  ze & 7)==0 );  /
bb90: 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
bba0: 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a  nt of pageSize *
bbb0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
bbc0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
bbd0: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
bbe0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a  >pageSize);.   .
bbf0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
bc00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
bc10: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
bc20: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
bc30: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
bc40: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
bc50: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
bc60: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
bc70: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
bc80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bc90: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
bca0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
bcb0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
bcc0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
bcd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
bce0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
bcf0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
bd00: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
bd10: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
bd20: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
bd30: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
bd40: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
bd50: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
bd60: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
bd70: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
bd80: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
bd90: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
bda0: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
bdb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
bdc0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bdd0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
bde0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
bdf0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
be00: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
be10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
be20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
be30: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
be40: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
be50: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
be60: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
be70: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
be80: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
be90: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
bea0: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
beb0: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
bec0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
bed0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
bee0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
bef0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
bf00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
bf10: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
bf20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
bf30: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
bf40: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
bf50: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
bf60: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
bf70: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
bf80: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
bf90: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
bfa0: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
bfb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
bfc0: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
bfd0: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
bfe0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
bff0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
c000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
c010: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
c020: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
c030: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
c040: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
c050: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
c060: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
c070: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
c080: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
c090: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
c0a0: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
c0b0: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
c0c0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
c0d0: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
c0e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
c0f0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
c100: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
c110: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
c120: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
c130: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
c140: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
c150: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
c160: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
c170: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
c180: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
c190: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c1b0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
c1c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
c1d0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
c1e0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
c1f0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
c200: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
c210: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
c220: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c230: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
c240: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
c250: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c270: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
c280: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
c290: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
c2a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c2b0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
c2c0: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
c2d0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
c2e0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
c2f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
c300: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
c310: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c320: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
c330: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
c340: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
c350: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
c360: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
c370: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
c380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
c390: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
c3a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
c3c0: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
c3d0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
c3e0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
c3f0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
c400: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
c410: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
c420: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
c430: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
c440: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
c450: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
c460: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
c470: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
c480: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
c490: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
c4a0: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
c4b0: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
c4c0: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
c4d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
c4e0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
c4f0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
c500: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
c510: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
c520: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
c530: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c540: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
c550: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
c560: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
c570: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
c580: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
c590: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
c5a0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
c5b0: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
c5c0: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
c5d0: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
c5e0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
c5f0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
c600: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
c610: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
c620: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
c630: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
c640: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
c650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c660: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
c670: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
c680: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
c690: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c6a0: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
c6b0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
c6c0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
c6d0: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
c6e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c6f0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
c700: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
c710: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
c720: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
c730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
c740: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
c750: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c760: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
c770: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
c780: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
c790: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
c7a0: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
c7b0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
c7c0: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
c7d0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
c7e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
c7f0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
c800: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
c810: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
c820: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
c830: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
c840: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
c850: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
c860: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
c870: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
c880: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
c890: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
c8a0: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
c8b0: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
c8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
c8d0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
c8e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
c8f0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
c900: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
c910: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
c920: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
c930: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
c940: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
c950: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
c960: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
c970: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
c980: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
c990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c9a0: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
c9b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
c9c0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
c9d0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
c9e0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
c9f0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
ca00: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
ca10: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
ca20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ca30: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
ca40: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
ca50: 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
ca60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43  db = p->db;.  pC
ca70: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
ca80: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
ca90: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
caa0: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
cab0: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
cac0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
cad0: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
cae0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
caf0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
cb00: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
cb10: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
cb20: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
cb30: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
cb40: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
cb50: 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
cb60: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
cb70: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
cb80: 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
cb90: 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
cba0: 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
cbb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
cbc0: 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
cbd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
cbe0: 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
cbf0: 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
cc00: 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
cc10: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
cc20: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
cc30: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
cc40: 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
cc50: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
cc60: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
cc70: 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
cc80: 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
cc90: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
cca0: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
ccb0: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
ccc0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
ccd0: 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
cce0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
ccf0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
cd00: 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
cd10: 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
cd20: 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
cd30: 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
cd40: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
cd50: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
cd60: 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
cd70: 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
cd80: 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
cd90: 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
cda0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
cdb0: 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
cdc0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
cdd0: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
cde0: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
cdf0: 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
ce00: 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
ce10: 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
ce20: 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
ce30: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
ce40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
ce50: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
ce60: 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
ce70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
ce80: 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
ce90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cea0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
ceb0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
cec0: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
ced0: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
cee0: 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
cef0: 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
cf00: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
cf10: 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
cf20: 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
cf30: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
cf40: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
cf50: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
cf60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cf70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
cf80: 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
cf90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
cfa0: 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
cfb0: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
cfc0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
cfd0: 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
cfe0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
cff0: 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
d000: 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
d010: 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
d020: 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
d030: 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
d040: 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
d050: 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
d060: 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
d070: 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
d080: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
d090: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
d0a0: 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
d0b0: 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
d0c0: 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
d0d0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
d0e0: 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
d0f0: 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
d100: 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
d110: 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
d120: 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
d130: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
d140: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
d150: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
d160: 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
d170: 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
d180: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
d190: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
d1a0: 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
d1b0: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
d1c0: 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
d1d0: 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
d1e0: 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
d1f0: 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
d200: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
d210: 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
d220: 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
d230: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
d240: 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
d250: 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
d260: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
d270: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
d280: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d290: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
d2a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
d2b0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
d2c0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
d2d0: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
d2e0: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
d2f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
d300: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
d310: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d320: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
d330: 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
d340: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
d350: 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
d360: 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
d370: 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
d380: 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
d390: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
d3a0: 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
d3b0: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
d3c0: 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
d3d0: 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
d3e0: 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
d3f0: 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
d400: 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
d410: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
d420: 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
d430: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
d440: 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
d450: 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
d460: 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
d470: 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
d480: 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
d490: 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
d4a0: 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
d4b0: 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
d4c0: 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
d4d0: 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
d4e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d4f0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
d500: 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
d510: 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
d520: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
d530: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
d540: 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
d550: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
d560: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d570: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
d580: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
d590: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
d5a0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
d5b0: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
d5c0: 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
d5d0: 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
d5e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
d5f0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
d600: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
d610: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
d620: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
d630: 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
d640: 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
d650: 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
d660: 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
d670: 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
d680: 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
d690: 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
d6a0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
d6b0: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
d6c0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
d6d0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
d6e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
d6f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d700: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
d710: 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
d720: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
d730: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
d740: 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
d750: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
d760: 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
d770: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
d780: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
d790: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
d7a0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
d7b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
d7c0: 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
d7d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d7e0: 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
d7f0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
d800: 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
d810: 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
d820: 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
d830: 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   per page..**.**
d840: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
d850: 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
d860: 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
d870: 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
d880: 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
d890: 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
d8a0: 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
d8b0: 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
d8c0: 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
d8d0: 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
d8e0: 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
d8f0: 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
d900: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
d910: 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
d920: 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
d930: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
d940: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
d950: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
d960: 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
d970: 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
d980: 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
d990: 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
d9a0: 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
d9b0: 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
d9c0: 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
d9d0: 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
d9e0: 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
d9f0: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
da00: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
da10: 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
da20: 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
da30: 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ft unchanged..*/
da40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
da50: 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
da60: 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
da70: 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
da80: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
daa0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
dab0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
dac0: 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
dad0: 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
dae0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
daf0: 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
db00: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
db10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
db20: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
db30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
db40: 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
db50: 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
db60: 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
db70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
db80: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
db90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
dba0: 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
dbb0: 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
dbc0: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
dbd0: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
dbe0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
dbf0: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
dc00: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
dc10: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
dc20: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
dc30: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
dc40: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
dc50: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
dc60: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
dc70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
dc80: 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
dc90: 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
dca0: 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  (pBt);.    rc = 
dcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
dcc0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
dcd0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
dce0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  ize);.  }.  pBt-
dcf0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
dd00: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
dd10: 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 73  16)nReserve;.  s
dd20: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
dd30: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
dd40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dd50: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
dd60: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
dd70: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
dd80: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
dd90: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
dda0: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
ddb0: 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
ddc0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
ddd0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
dde0: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
ddf0: 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
de00: 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
de10: 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
de20: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
de30: 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
de40: 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
de50: 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
de60: 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
de70: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
de80: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
de90: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
dea0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
deb0: 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
dec0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
ded0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
dee0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
def0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
df00: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
df10: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
df20: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
df30: 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
df40: 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
df50: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
df60: 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
df70: 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
df80: 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
df90: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
dfa0: 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
dfb0: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
dfc0: 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
dfd0: 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
dfe0: 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
dff0: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
e000: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
e010: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
e020: 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
e030: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
e040: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
e050: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
e060: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e070: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64  return n;.}.#end
e080: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
e090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
e0a0: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
e0b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e0c0: 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
e0d0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
e0e0: 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
e0f0: 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
e100: 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
e110: 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
e120: 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
e130: 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
e140: 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
e150: 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
e160: 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
e170: 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
e180: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
e190: 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
e1a0: 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
e1b0: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
e1c0: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
e1d0: 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
e1e0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
e1f0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
e200: 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
e210: 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
e220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e230: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
e240: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
e250: 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
e260: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
e270: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e280: 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
e290: 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
e2a0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
e2b0: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
e2c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
e2d0: 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  d && (av ?1:0)!=
e2e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
e2f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
e300: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
e310: 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
e320: 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
e330: 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
e340: 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
e350: 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
e360: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e370: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
e380: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
e390: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
e3a0: 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
e3b0: 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
e3c0: 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
e3d0: 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
e3e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
e3f0: 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
e400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
e410: 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
e420: 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
e430: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
e440: 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
e450: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
e460: 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
e470: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
e480: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
e490: 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
e4a0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
e4b0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
e4c0: 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
e4d0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
e4e0: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
e4f0: 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
e500: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
e510: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
e520: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
e530: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
e540: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
e550: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
e560: 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
e570: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
e580: 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
e590: 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
e5a0: 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
e5b0: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
e5c0: 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
e5d0: 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
e5e0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
e5f0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
e600: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
e610: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
e620: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
e630: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
e640: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
e650: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
e660: 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
e670: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
e680: 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
e690: 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
e6a0: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
e6b0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
e6c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
e6d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
e6e0: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
e6f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e700: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e710: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
e720: 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74  Bt->pPage1 ) ret
e730: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
e740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e750: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
e760: 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
e770: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e780: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e790: 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
e7a0: 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
e7b0: 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
e7c0: 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
e7d0: 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
e7e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
e7f0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
e800: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
e810: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
e820: 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
e830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e840: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
e850: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65 6c  it_failed;.  }el
e860: 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  se if( nPage>0 )
e870: 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53 69  {.    int pageSi
e880: 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61 62  ze;.    int usab
e890: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
e8a0: 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
e8b0: 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
e8c0: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
e8d0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
e8e0: 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
e8f0: 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
e900: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
e910: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
e920: 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
e930: 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>1 ){.      pB
e940: 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
e950: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e960: 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20  age1[19]>1 ){.  
e970: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
e980: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
e990: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61  }..    /* The ma
e9a0: 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66  ximum embedded f
e9b0: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
e9c0: 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e  exactly 25%.  An
e9d0: 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20  d the minimum.  
e9e0: 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72    ** embedded fr
e9f0: 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31  action must be 1
ea00: 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65  2.5% for both le
ea10: 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d  af-data and non-
ea20: 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a  leaf-data..    *
ea30: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
ea40: 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
ea50: 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
ea60: 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
ea70: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
ea80: 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
ea90: 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
eaa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
eab0: 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
eac0: 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
ead0: 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
eae0: 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
eaf0: 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
eb00: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 67      pageSize = g
eb10: 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b 31  et2byte(&page1[1
eb20: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  6]);.    if( ((p
eb30: 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
eb40: 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65 53  ize)!=0 || pageS
eb50: 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20 20  ize<512 ||.     
eb60: 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 50     (SQLITE_MAX_P
eb70: 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20 26  AGE_SIZE<32768 &
eb80: 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  & pageSize>SQLIT
eb90: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
eba0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
ebb0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ebc0: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ebd0: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
ebe0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
ebf0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
ec00: 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
ec10: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  0];.    if( page
ec20: 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
ec30: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
ec40: 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
ec50: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
ec60: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
ec70: 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
ec80: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
ec90: 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
eca0: 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
ecb0: 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
ecc0: 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
ecd0: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
ece0: 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
ecf0: 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
ed00: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
ed10: 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
ed20: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
ed30: 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
ed40: 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
ed50: 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
ed60: 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
ed70: 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
ed80: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ed90: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
eda0: 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
edb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
edc0: 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  16)usableSize;. 
edd0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
ede0: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
edf0: 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
ee00: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
ee10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
ee20: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
ee30: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
ee40: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
ee50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ee60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ee70: 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
ee80: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
ee90: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
eea0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
eeb0: 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
eec0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
eed0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
eee0: 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
eef0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef00: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ef10: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
ef20: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
ef30: 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
ef40: 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
ef50: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
ef60: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
ef70: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
ef80: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
ef90: 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
efa0: 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
efb0: 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
efc0: 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
efd0: 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
efe0: 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
eff0: 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
f000: 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
f010: 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
f020: 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
f030: 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
f040: 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
f050: 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
f060: 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
f070: 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
f080: 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
f090: 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
f0a0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
f0b0: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
f0c0: 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
f0d0: 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
f0e0: 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
f0f0: 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
f100: 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
f110: 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
f120: 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
f130: 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
f140: 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
f150: 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
f160: 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
f170: 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
f180: 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
f190: 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
f1a0: 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
f1b0: 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
f1c0: 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
f1d0: 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
f1e0: 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
f1f0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
f200: 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  4/255 - 23;.  pB
f210: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70  t->minLocal = (p
f220: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
f230: 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
f240: 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
f250: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
f260: 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
f270: 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
f280: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
f290: 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65  255 - 23;.  asse
f2a0: 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
f2b0: 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
f2c0: 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
f2d0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
f2e0: 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53  age1;.  return S
f2f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
f300: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
f310: 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
f320: 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
f330: 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
f340: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f350: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
f360: 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28   like lockBtree(
f370: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
f380: 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68   also invokes th
f390: 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61  e.** busy callba
f3a0: 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 6c  ck if there is l
f3b0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a  ock contention..
f3c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
f3d0: 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
f3e0: 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20  (Btree *pRef){. 
f3f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f400: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
f410: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
f420: 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a  sMutex(pRef) );.
f430: 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72    if( pRef->inTr
f440: 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
f450: 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e  ){.    u8 inTran
f460: 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e  saction = pRef->
f470: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f480: 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74  on;.    btreeInt
f490: 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
f4a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
f4b0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52  reeBeginTrans(pR
f4c0: 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66  ef, 0);.    pRef
f4d0: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
f4e0: 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63  tion = inTransac
f4f0: 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e  tion;.    pRef->
f500: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
f510: 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63  NONE;.    if( rc
f520: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f530: 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e       pRef->pBt->
f540: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
f550: 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49      }.    btreeI
f560: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
f570: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f580: 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a  .}.       ../*.*
f590: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
f5a0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
f5b0: 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
f5c0: 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
f5d0: 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
f5e0: 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
f5f0: 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
f600: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
f610: 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
f620: 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
f630: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
f640: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f650: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
f660: 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
f670: 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
f680: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
f690: 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74  here are any out
f6a0: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
f6b0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
f6c0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
f6d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
f6e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
f6f0: 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
f700: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f720: 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
f730: 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
f740: 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
f750: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f760: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f770: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
f780: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
f790: 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
f7a0: 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
f7b0: 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
f7c0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
f7d0: 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
f7e0: 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20 20  Pager)>=1 ){.   
f7f0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
f800: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
f810: 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66 28  .#if 0.      if(
f820: 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
f830: 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
f840: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
f850: 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
f860: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61          pPage->a
f870: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
f880: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
f890: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
f8a0: 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
f8b0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70 50   pBt;.        pP
f8c0: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  age->pgno = 1;. 
f8d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
f8e0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
f8f0: 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
f900: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
f910: 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
f920: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f930: 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ew database by i
f940: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
f950: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
f960: 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
f970: 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
f980: 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
f990: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
f9a0: 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
f9b0: 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
f9c0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
f9d0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
f9e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f9f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
fa00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
fa10: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
fa20: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
fa30: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
fa40: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e  ITE_OK || nPage>
fa50: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fa60: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
fa70: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
fa80: 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
fa90: 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
faa0: 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
fab0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
fac0: 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
fad0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
fae0: 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
faf0: 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
fb00: 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
fb10: 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
fb20: 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
fb30: 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
fb40: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
fb50: 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
fb60: 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
fb70: 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
fb80: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
fb90: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
fba0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
fbb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
fbc0: 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
fbd0: 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
fbe0: 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
fbf0: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
fc00: 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
fc10: 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
fc20: 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
fc30: 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
fc40: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
fc50: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
fc60: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
fc70: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
fc80: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
fc90: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
fca0: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
fcb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fcc0: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
fcd0: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
fce0: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
fcf0: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
fd00: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
fd10: 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
fd20: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
fd30: 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
fd40: 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
fd50: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fd60: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
fd70: 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
fd80: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
fd90: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
fda0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fdb0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
fdc0: 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
fdd0: 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
fde0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
fdf0: 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
fe00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
fe10: 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
fe20: 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
fe30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
fe40: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
fe50: 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
fe60: 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
fe70: 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
fe80: 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
fe90: 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
fea0: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
feb0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
fec0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
fed0: 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
fee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
fef0: 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
ff00: 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
ff10: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
ff20: 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
ff30: 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
ff40: 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
ff50: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
ff60: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
ff70: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
ff80: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
ff90: 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
ffa0: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
ffb0: 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
ffc0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
ffd0: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
ffe0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
fff0: 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
10000 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
10010 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
10020 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
10030 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
10040 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
10050 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
10060 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
10070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10080 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
10090 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
100a0 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
100b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
100c0 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
100d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
100e0 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
100f0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
10100 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
10110 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
10120 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
10130 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
10140 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
10150 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
10160 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
10170 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
10180 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
10190 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
101a0 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
101b0 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
101c0 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
101d0 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
101e0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
101f0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
10200 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
10210 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
10220 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
10230 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
10240 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
10250 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
10260 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
10270 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
10280 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
10290 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
102a0 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
102b0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
102c0 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
102d0 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
102e0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
102f0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
10300 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
10310 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
10320 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
10330 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
10340 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
10350 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
10360 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
10370 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
10380 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
10390 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
103a0 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
103b0 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
103c0 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
103d0 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
103e0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
103f0 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
10400 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
10410 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
10420 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
10430 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
10440 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
10450 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
10460 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
10470 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
10480 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
10490 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
104a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
104b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
104c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
104d0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
104e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74  db = p->db;.  bt
104f0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
10500 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
10510 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
10520 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
10530 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
10540 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
10550 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
10560 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
10570 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
10580 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
10590 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
105a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
105b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
105c0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
105d0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
105e0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
105f0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
10600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
10610 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
10620 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
10630 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
10640 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
10650 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
10660 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
10670 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
10680 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
10690 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
106a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
106b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
106c0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
106d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
106e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
106f0 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
10700 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
10710 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
10720 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
10730 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
10740 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
10750 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
10760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
10770 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
10780 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
10790 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
107a0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
107b0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
107c0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
107d0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
107e0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
107f0 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
10800 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
10810 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
10820 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
10830 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
10840 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
10850 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
10860 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
10870 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
10880 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
10890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
108a0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
108b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
108c0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
108d0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
108e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
108f0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
10900 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
10910 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
10920 65 6e 64 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20  endif..  do {.  
10930 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
10940 31 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 6f  1==0 ){.      do
10950 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  {.        rc = l
10960 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a 20  ockBtree(pBt);. 
10970 20 20 20 20 20 7d 77 68 69 6c 65 28 20 70 42 74       }while( pBt
10980 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 72  ->pPage1==0 && r
10990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
109a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
109b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
109c0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
109d0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
109e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
109f0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
10a00 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
10a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10a20 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
10a30 42 74 2d 3e 70 50 61 67 65 72 2c 20 77 72 66 6c  Bt->pPager, wrfl
10a40 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ag>1);.        i
10a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10a60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10a70 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
10a80 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
10a90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
10aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
10ac0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
10ad0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
10ae0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10af0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
10b00 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
10b10 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
10b20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
10b30 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
10b40 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
10b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10b60 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
10b70 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
10b80 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
10b90 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20  nsaction++;.    
10ba0 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
10bb0 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
10bc0 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
10bd0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
10be0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
10bf0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
10c00 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
10c10 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
10c20 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ns;.    }.#ifnde
10c30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10c40 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69  ARED_CACHE.    i
10c50 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
10c60 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
10c70 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
10c80 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
10c90 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   p;.      pBt->i
10ca0 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38  sExclusive = (u8
10cb0 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20  )(wrflag>1);.   
10cc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a   }.#endif.  }...
10cd0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
10ce0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10cf0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
10d00 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
10d10 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
10d20 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
10d30 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
10d40 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
10d50 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
10d60 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
10d70 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
10d80 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
10d90 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
10da0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
10db0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
10dc0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
10dd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
10de0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
10df0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
10e00 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
10e10 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
10e20 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
10e30 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
10e40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
10e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
10e80 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
10e90 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
10ea0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
10eb0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
10ec0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
10ed0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
10ee0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
10ef0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
10f00 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
10f10 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
10f20 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
10f30 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
10f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
10f50 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
10f60 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
10f70 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
10fa0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
10fb0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10fd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
10fe0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
10ff0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11020 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
11030 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
11040 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
11050 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
11060 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
11070 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
11080 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
11090 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
110a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
110b0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
110c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
110d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
110e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
110f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
11100 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
11110 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
11120 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
11130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
11140 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
11150 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
11160 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
11170 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
11180 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
11190 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
111a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
111b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  .      goto set_
111c0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
111d0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
111e0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
111f0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
11200 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
11210 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
11220 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
11230 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
11240 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
11250 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
11260 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11270 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
11280 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
11290 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
112a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
112b0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
112c0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
112d0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
112e0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
112f0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
11300 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
11310 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
11320 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  no);.  }..set_ch
11330 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
11340 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
11350 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
11360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11370 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
11380 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20 69  n pPage, which i
11390 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
113a0 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 2c  be a btree page,
113b0 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77   not an overflow
113c0 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70  .** page, is a p
113d0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
113e0 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69  From. Modify thi
113f0 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61  s pointer so tha
11400 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
11410 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72  * iTo. Parameter
11420 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73   eType describes
11430 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69   the type of poi
11440 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66  nter to be modif
11450 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c  ied, as .** foll
11460 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  ows:.**.** PTRMA
11470 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61  P_BTREE:     pPa
11480 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
11490 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
114a0 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c  points at a chil
114b0 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  d .**           
114c0 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20          page of 
114d0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
114e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70  MAP_OVERFLOW1: p
114f0 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
11500 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
11510 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f  r points at an o
11520 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20  verflow.**      
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
11540 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  e pointed to by 
11550 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  one of the cells
11560 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   on pPage..**.**
11570 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
11580 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f  2: pPage is an o
11590 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68  verflow-page. Th
115a0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
115b0 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20   at the next.** 
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20    overflow page 
115e0 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a  in the list..*/.
115f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66  static int modif
11600 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d  yPagePointer(Mem
11610 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e  Page *pPage, Pgn
11620 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54  o iFrom, Pgno iT
11630 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20  o, u8 eType){.  
11640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11650 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
11660 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
11670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11680 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
11690 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
116a0 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  e) );.  if( eTyp
116b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
116c0 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
116d0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
116e0 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
116f0 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
11700 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
11710 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
11720 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
11730 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
11740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11750 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11760 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
11770 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
11780 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
11790 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67     u8 isInitOrig
117a0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
117b0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
117c0 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20   int nCell;..   
117d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
117e0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
117f0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
11800 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
11810 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
11820 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
11830 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
11840 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
11850 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
11860 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
11870 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
11880 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73   info;.        s
11890 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
118a0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
118b0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
118c0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
118d0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
118e0 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
118f0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
11900 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
11910 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11920 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
11930 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
11940 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
11950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
11970 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11980 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
11990 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
119a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
119b0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
119c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
119d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
119e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
119f0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
11a00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
11a10 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
11a20 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
11a30 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
11a40 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
11a50 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
11a60 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
11a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11a80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
11a90 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
11aa0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
11ab0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
11ac0 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
11ad0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
11ae0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
11af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11b00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
11b10 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
11b20 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
11b30 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
11b40 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
11b50 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
11b60 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
11b70 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
11b80 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
11b90 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
11ba0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
11bb0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
11bc0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
11bd0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
11be0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
11bf0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
11c00 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
11c10 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11c20 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
11c30 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
11c40 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
11c50 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
11c60 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
11c70 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
11c80 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
11c90 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
11ca0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
11cb0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
11cc0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
11cd0 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20  nt isCommit.){. 
11ce0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
11cf0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
11d00 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
11d10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
11d20 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
11d30 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
11d40 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
11d50 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
11d60 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
11d70 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
11d80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
11d90 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
11da0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
11db0 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
11dc0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
11dd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
11de0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
11df0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11e00 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11e10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11e20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
11e30 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
11e40 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
11e50 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
11e60 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
11e70 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
11e80 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
11e90 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
11ea0 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
11eb0 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
11ec0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
11ed0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
11ee0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
11ef0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
11f00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
11f10 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
11f20 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
11f30 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
11f40 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
11f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11f70 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
11f80 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
11f90 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
11fa0 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
11fb0 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
11fc0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
11fd0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
11fe0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
11ff0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
12000 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
12010 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
12020 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
12030 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
12040 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
12050 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
12060 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
12070 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
12080 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
12090 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
120a0 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
120b0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
120c0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
120d0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
120e0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
120f0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
12100 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
12110 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
12120 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
12130 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
12140 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
12150 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
12160 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
12170 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
12180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12190 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
121a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
121b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
121c0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
121d0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
121e0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
121f0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
12200 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
12210 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
12220 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
12230 57 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a  W2, iFreePage);.
12240 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12260 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12270 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12280 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
12290 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
122a0 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
122b0 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
122c0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
122d0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
122e0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
122f0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
12300 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
12310 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
12320 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
12330 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
12340 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12350 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
12360 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
12370 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
12380 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
123a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
123b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
123c0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
123d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
123e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
123f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
12400 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
12410 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
12420 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
12430 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
12440 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
12450 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
12460 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
12470 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
12480 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
124a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
124b0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
124c0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
124d0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
124e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
124f0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
12500 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
12510 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
12520 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
12530 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
12540 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
12550 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
12560 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
12570 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
12580 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
12590 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
125a0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
125b0 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
125c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
125d0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
125e0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
125f0 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
12600 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
12610 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
12620 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
12630 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
12640 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
12650 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
12660 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
12670 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
12680 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
12690 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
126a0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
126b0 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
126c0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
126d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
126e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
126f0 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c  n-zero, the impl
12700 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d  ementation assum
12710 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
12720 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
12730 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
12740 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
12750 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
12760 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
12770 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
12780 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
12790 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
127a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
127b0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
127c0 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
127d0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
127e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
127f0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
12800 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
12810 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
12820 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
12830 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
12840 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12850 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
12860 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
12870 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12880 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12890 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
128a0 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
128b0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
128c0 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
128d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
128e0 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Bt) ){.    int r
128f0 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  c;.    u8 eType;
12900 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
12910 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
12920 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
12930 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12940 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
12950 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20  nFreeList==0 || 
12960 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b  nFin==iLastPg ){
12970 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12980 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
12990 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
129a0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
129b0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
129c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
129d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
129e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
129f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
12a00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
12a10 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
12a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
12a30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
12a40 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
12a50 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
12a60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46   ){.      if( nF
12a70 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  in==0 ){.       
12a80 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
12a90 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
12aa0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
12ab0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
12ac0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
12ad0 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72   nFin is non-zer
12ae0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
12af0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
12b00 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
12b10 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
12b20 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
12b30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
12b40 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
12b50 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
12b60 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
12b70 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
12b80 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
12b90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
12ba0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
12bb0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
12bc0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
12bd0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
12be0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
12bf0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
12c00 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20  iLastPg, 1);.   
12c10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12c20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12c30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12c40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12c50 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
12c60 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
12c70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
12c80 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
12c90 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12ca0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
12cb0 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
12cc0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
12cd0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
12ce0 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
12cf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
12d00 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg;..      rc = 
12d10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
12d20 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
12d30 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
12d40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12d60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12d70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
12d80 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
12d90 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
12da0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
12db0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
12dc0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
12dd0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
12de0 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
12df0 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
12e00 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
12e10 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
12e20 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
12e30 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
12e40 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
12e50 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
12e60 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
12e70 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
12e80 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
12e90 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
12ea0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
12eb0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
12ec0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
12ed0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
12ee0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
12ef0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
12f00 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
12f10 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
12f20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
12f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12f40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
12f50 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
12f60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12f70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12f80 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
12f90 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
12fa0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
12fb0 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
12fc0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
12fd0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
12fe0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
12ff0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13000 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
13010 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
13020 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13040 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
13050 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
13060 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
13070 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
13080 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
13090 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
130a0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
130b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
130c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
130d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
130e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
130f0 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
13100 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
13110 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
13120 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
13130 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
13140 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
13150 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 61  Pg) ){.      iLa
13160 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
13170 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
13180 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
13190 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
131a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
131b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
131c0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
131d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
131e0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
131f0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
13200 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
13210 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
13220 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
13230 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
13240 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
13250 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
13260 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
13270 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
13280 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
13290 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
132a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
132b0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
132c0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
132d0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
132e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
132f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
13300 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
13310 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
13320 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
13330 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
13340 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
13350 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13360 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
13370 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
13380 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
13390 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
133a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
133b0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
133c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
133d0 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
133e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
133f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13400 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
13410 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
13420 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
13430 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
13440 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
13450 74 2c 20 30 2c 20 70 61 67 65 72 50 61 67 65 63  t, 0, pagerPagec
13460 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a  ount(pBt));.  }.
13470 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13480 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
134a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
134b0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
134c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
134d0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
134e0 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
134f0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
13500 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
13510 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
13520 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
13530 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
13540 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
13550 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
13560 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13570 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
13580 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
13590 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
135a0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
135b0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
135c0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
135d0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
135e0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
135f0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
13600 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13610 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
13620 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
13630 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13640 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
13650 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
13660 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
13670 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
13680 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
13690 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  nt(pPager) );.. 
136a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
136b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
136c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
136d0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
136e0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
136f0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
13700 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
13710 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
13720 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
13730 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  ;.    Pgno nFree
13740 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d  ;.    Pgno nPtrm
13750 61 70 3b 0a 20 20 20 20 50 67 6e 6f 20 69 46 72  ap;.    Pgno iFr
13760 65 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  ee;.    const in
13770 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61  t pgsz = pBt->pa
13780 67 65 53 69 7a 65 3b 0a 20 20 20 20 50 67 6e 6f  geSize;.    Pgno
13790 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61   nOrig = pagerPa
137a0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20  gecount(pBt);.. 
137b0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
137c0 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
137d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
137e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
137f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
13800 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49  if( nOrig==PENDI
13810 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
13820 29 20 29 7b 0a 20 20 20 20 20 20 6e 4f 72 69 67  ) ){.      nOrig
13830 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 46  --;.    }.    nF
13840 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
13850 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
13860 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74  ta[36]);.    nPt
13870 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
13880 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
13890 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67  O(pBt, nOrig)+pg
138a0 73 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a  sz/5)/(pgsz/5);.
138b0 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
138c0 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
138d0 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
138e0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
138f0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
13900 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
13910 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
13920 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
13930 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
13940 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
13950 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
13960 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
13970 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
13980 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n--;.    }..    
13990 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
139a0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
139b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
139c0 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
139d0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
139e0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
139f0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
13a00 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
13a10 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
13a20 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
13a30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13a40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13a50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13a60 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
13a70 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
13a80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
13a90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
13aa0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
13ab0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
13ac0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
13ad0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
13ae0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
13af0 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
13b00 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a  r, nFin);.    }.
13b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
13b30 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
13b40 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
13b50 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
13b60 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50  ( nRef==sqlite3P
13b70 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
13b80 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
13b90 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
13ba0 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
13bb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
13bc0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  */../*.** This r
13bd0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
13be0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
13bf0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
13c00 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
13c10 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
13c20 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
13c30 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
13c40 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
13c50 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
13c60 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
13c70 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
13c80 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
13c90 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
13ca0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
13cb0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
13cc0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
13cd0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
13ce0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
13cf0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
13d00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
13d10 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
13d20 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
13d30 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
13d40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
13d50 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
13d60 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
13d70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13d80 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
13d90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13da0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
13db0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
13dc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
13dd0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
13de0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
13df0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
13e00 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
13e10 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
13e20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
13e30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
13e40 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
13e50 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
13e60 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
13e70 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
13e80 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
13e90 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
13ea0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
13eb0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
13ec0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13ed0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
13ee0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
13ef0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
13f00 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
13f10 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
13f20 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
13f30 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
13f40 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
13f50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
13f60 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
13f70 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
13f80 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
13f90 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
13fa0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
13fb0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
13fc0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
13fd0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
13fe0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
13ff0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
14000 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
14010 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
14020 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
14030 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
14040 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
14050 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
14060 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
14070 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
14080 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
14090 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
140a0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
140b0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
140c0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
140d0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
140e0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
140f0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
14100 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
14110 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
14120 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
14130 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
14140 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
14150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14160 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
14170 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14180 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
14190 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
141a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
141b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42  Enter(p);.    pB
141c0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23  t->db = p->db;.#
141d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
141e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
141f0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
14200 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
14210 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
14220 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
14230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
14250 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
14260 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
14270 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14280 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14290 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
142a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
142b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
142c0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
142d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
142e0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
142f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
14300 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
14310 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
14320 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
14330 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14340 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
14350 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
14360 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
14370 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
14380 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
14390 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
143a0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
143b0 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
143c0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
143d0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
143e0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
143f0 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
14400 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
14410 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
14420 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
14430 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
14440 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
14450 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
14460 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
14470 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
14480 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
14490 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
144a0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
144b0 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
144c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
144d0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
144e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
144f0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
14500 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
14510 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
14520 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
14530 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14540 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
14550 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
14560 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
14570 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
14580 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
14590 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
145a0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
145b0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
145c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
145d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
145e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
145f0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
14600 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14610 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
14620 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
14630 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
14640 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
14650 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
14660 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
14670 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
14680 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
14690 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
146a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
146b0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
146c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
146d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
146e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
146f0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
14700 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
14710 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
14720 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14730 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
14740 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
14750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14770 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14780 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14790 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
147a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
147b0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
147c0 20 7d 0a 20 20 63 6c 65 61 72 41 6c 6c 53 68 61   }.  clearAllSha
147d0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
147e0 6b 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ks(p);..  /* If 
147f0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
14800 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73  ny kind of trans
14810 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63  action open, dec
14820 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73  rement the trans
14830 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e  action.  ** coun
14840 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
14850 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
14860 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
14870 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20  reaches 0, set. 
14880 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20 73   ** the shared s
14890 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
148a0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
148b0 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63 61  reeIfUnused() ca
148c0 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69  ll below.  ** wi
148d0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
148e0 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
148f0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
14900 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42  S_NONE ){.    pB
14910 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
14920 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
14930 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
14940 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
14950 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
14960 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
14970 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
14980 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e  e handles curren
14990 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
149a0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
149b0 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a  E and unlock.  *
149c0 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20 74  * the pager if t
149d0 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
149e0 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
149f0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
14a00 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65  on..  */.  btree
14a10 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
14a20 70 42 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61  pBt);.  p->inTra
14a30 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
14a40 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14a50 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
14a60 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14a70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14a80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14aa0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
14ab0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
14ac0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
14ad0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
14ae0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
14af0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
14b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
14b10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
14b20 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
14b30 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
14b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14b50 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14b60 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
14b70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14b80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
14ba0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
14bb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
14bc0 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63  umber of write-c
14bd0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
14be0 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  his handle. This
14bf0 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
14c00 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
14c10 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
14c20 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
14c30 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
14c40 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
14c50 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
14c60 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
14c70 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73  ne, a write-curs
14c80 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72  or is any cursor
14c90 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61   that.** is capa
14ca0 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74  ble of writing t
14cb0 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20  o the databse.  
14cc0 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63  That means the c
14cd0 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69  ursor was.** ori
14ce0 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ginally opened f
14cf0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74  or writing and t
14d00 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f  he cursor has no
14d10 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a  t be disabled.**
14d20 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73   by having its s
14d30 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20  tate changed to 
14d40 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f  CURSOR_FAULT..*/
14d50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
14d60 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74  tWriteCursors(Bt
14d70 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14d80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
14d90 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66    int r = 0;.  f
14da0 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75  or(pCur=pBt->pCu
14db0 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72  rsor; pCur; pCur
14dc0 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCur->pNext){. 
14dd0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46     if( pCur->wrF
14de0 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74  lag && pCur->eSt
14df0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
14e00 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
14e10 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
14e20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
14e30 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
14e40 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
14e50 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
14e60 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
14e70 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
14e80 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61   cursor on BtSha
14e90 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
14ea0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ** references..*
14eb0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
14ec0 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e  r is tripped, in
14ed0 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20  cluding cursors 
14ee0 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74  that belong.** t
14ef0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
14f00 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
14f10 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73  t happen to be s
14f20 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61  haring.** the ca
14f30 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
14f40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14f50 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
14f60 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
14f70 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63  occurs..** All c
14f80 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65  ursors using the
14f90 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74   same cache must
14fa0 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74   be tripped.** t
14fb0 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66  o prevent them f
14fc0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73  rom trying to us
14fd0 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65  e the btree afte
14fe0 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  r.** the rollbac
14ff0 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b  k.  The rollback
15000 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65   may have delete
15010 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d  d tables.** or m
15020 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c  oved root pages,
15030 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75   so it is not su
15040 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73  fficient to.** s
15050 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ave the state of
15060 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
15070 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65  e cursor must be
15080 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  .** invalidated.
15090 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
150a0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
150b0 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
150c0 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b  e, int errCode){
150d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
150e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
150f0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66  ter(pBtree);.  f
15100 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
15110 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
15120 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
15130 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
15140 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
15150 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74  r(p);.    p->eSt
15160 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
15170 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20  LT;.    p->skip 
15180 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
15190 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
151a0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
151b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
151c0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
151d0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
151e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
151f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15200 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
15210 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
15220 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
15230 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
15240 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
15250 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
15260 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
15270 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
15280 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
15290 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
152a0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
152b0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
152c0 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
152d0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
152e0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
152f0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
15300 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
15310 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
15320 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
15330 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
15340 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
15350 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
15360 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15370 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
15380 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
15390 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
153a0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
153b0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71  e *pPage1;..  sq
153c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
153d0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
153e0 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 73 61  p->db;.  rc = sa
153f0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
15400 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
15410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15420 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
15430 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15440 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
15450 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
15460 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
15470 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
15480 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
15490 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
154a0 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
154b0 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
154c0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
154d0 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
154e0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
154f0 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
15500 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
15510 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
15520 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
15530 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
15540 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
15550 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
15560 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
15570 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
15580 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
15590 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
155a0 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
155b0 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
155c0 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
155d0 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
155e0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
155f0 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
15600 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
15610 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
15620 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
15630 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
15640 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
15650 3b 0a 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72  ;.  clearAllShar
15660 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
15670 73 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  s(p);..  if( p->
15680 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
15690 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
156a0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
156b0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
156c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
156d0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
156e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
156f0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
15700 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
15710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15720 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
15730 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
15740 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
15750 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
15760 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
15770 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
15780 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
15790 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
157a0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
157b0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
157c0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
157d0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
157e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
157f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
15800 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
15810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15820 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15830 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
15840 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
15850 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
15860 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
15870 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
15880 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
15890 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
158a0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
158b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
158c0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
158d0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
158e0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
158f0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
15900 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
15910 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
15920 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
15930 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
15940 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
15950 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
15960 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
15970 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
15980 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
15990 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
159a0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
159b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
159c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
159d0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
159e0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
159f0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
15a00 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
15a10 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a   can be rolled.*
15a20 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  * back independe
15a30 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
15a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f   transaction. Yo
15a50 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74  u must start a t
15a60 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62  ransaction .** b
15a70 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
15a80 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
15a90 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
15aa0 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
15ab0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69  omatically .** i
15ac0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
15ad0 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f  action commits o
15ae0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
15af0 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75  .** Statement su
15b00 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72  btransactions ar
15b10 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e  e used around in
15b20 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61  dividual SQL sta
15b30 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20  tements.** that 
15b40 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  are contained wi
15b50 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43  thin a BEGIN...C
15b60 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66  OMMIT block.  If
15b70 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a   a constraint.**
15b80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
15b90 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
15ba0 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f  nt, the effect o
15bb0 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65  f that one state
15bc0 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72  ment.** can be r
15bd0 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f  olled back witho
15be0 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c  ut having to rol
15bf0 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65  lback the entire
15c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
15c10 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20  .** A statement 
15c20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
15c30 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
15c40 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  s an anonymous s
15c50 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a  avepoint. The.**
15c60 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
15c70 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
15c80 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74  meter is the tot
15c90 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  al number of sav
15ca0 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c  epoints,.** incl
15cb0 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e  uding the new an
15cc0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
15cd0 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42  t, open on the B
15ce0 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74  -Tree. i.e. if t
15cf0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
15d00 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
15d10 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74   and no other st
15d20 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74  atement-transact
15d30 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53  ions open,.** iS
15d40 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54  tatement is 1. T
15d50 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  his anonymous sa
15d60 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72  vepoint can be r
15d70 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65  eleased or rolle
15d80 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  d back.** using 
15d90 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
15da0 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63  Savepoint() func
15db0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
15dc0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
15dd0 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  mt(Btree *p, int
15de0 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20   iStatement){.  
15df0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
15e00 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15e10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15e20 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
15e30 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  >db = p->db;.  a
15e40 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
15e50 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
15e60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
15e70 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
15e80 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
15e90 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
15ea0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
15eb0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
15ec0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
15ed0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
15ee0 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e  S_WRITE || pBt->
15ef0 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
15f00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54   rc = SQLITE_INT
15f10 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERNAL;.  }else{.
15f20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
15f30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15f40 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
15f50 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67     /* At the pag
15f60 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
15f70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
15f80 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
15f90 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20   with.    ** an 
15fa0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
15fb0 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
15fc0 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
15fd0 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a  itly using.    *
15fe0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
15ff0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
16000 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
16010 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
16020 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76  .    ** such sav
16030 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
16040 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
16050 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
16060 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20  t is active..   
16070 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
16080 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
16090 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
160a0 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
160b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
160c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
160d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
160e0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
160f0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
16100 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
16110 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
16120 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
16130 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
16140 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
16150 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
16160 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
16170 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
16180 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
16190 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
161a0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
161b0 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
161c0 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
161d0 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
161e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
161f0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
16200 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
16210 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
16220 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
16230 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
16240 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
16250 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
16260 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16270 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
16280 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
16290 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
162a0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
162b0 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
162c0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
162d0 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
162e0 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
162f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
16300 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
16310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16320 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
16330 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
16340 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
16350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16360 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
16370 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
16380 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
16390 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
163a0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
163b0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
163c0 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
163d0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
163e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
163f0 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
16400 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
16410 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
16420 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
16430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16440 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
16450 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
16460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16470 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
16480 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
16490 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
164a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
164b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  ){.      rc = ne
164c0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
164d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
164e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
164f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
16510 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
16520 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
16530 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
16540 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
16550 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63 71    The act of acq
16560 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20  uiring a cursor 
16570 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  gets a read lock
16580 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
16590 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
165a0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
165b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
165c0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
165d0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
165e0 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
165f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
16600 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
16610 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
16620 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
16630 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
16640 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
16650 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
16660 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
16670 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
16680 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
16690 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
166a0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
166b0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
166c0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
166d0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
166e0 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
166f0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16700 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
16710 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
16720 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
16730 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
16740 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
16750 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
16760 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
16770 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
16780 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
16790 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
167a0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
167b0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
167c0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
167d0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
167e0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
167f0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
16800 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
16810 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
16820 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
16830 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
16840 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
16850 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
16860 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
16870 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
16880 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
16890 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
168a0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
168b0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
168c0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
168d0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
168e0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
168f0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
16900 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
16910 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
16920 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
16930 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
16940 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
16950 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
16960 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
16970 65 28 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  e() bytes of mem
16980 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20  ory .** pointed 
16990 74 6f 20 62 79 20 70 43 75 72 20 68 61 76 65 20  to by pCur have 
169a0 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74  been zeroed by t
169b0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
169c0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
169d0 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
169e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a00 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
16a10 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
16a40 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
16a50 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
16a60 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
16a90 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
16aa0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
16ab0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
16ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
16ad0 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
16ae0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
16af0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
16b20 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
16b30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
16b40 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20  .  Pgno nPage;. 
16b50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16b60 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
16b70 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
16b80 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
16b90 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
16ba0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
16bb0 31 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61  1 );.  if( wrFla
16bc0 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
16bd0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
16be0 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
16bf0 28 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  (pBt->readOnly) 
16c00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16c10 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16c20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
16c30 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66  checkForReadConf
16c40 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c  licts(p, iTable,
16c50 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
16c60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16c70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
16c80 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  c==SQLITE_LOCKED
16c90 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a  _SHAREDCACHE );.
16ca0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16cb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16cc0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
16cd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63   ){.    rc = loc
16ce0 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28  kBtreeWithRetry(
16cf0 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  p);.    if( rc!=
16d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16d20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
16d30 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
16d40 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20  )iTable;.  rc = 
16d50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
16d60 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
16d70 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
16d80 29 3b 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ); .  if( rc!=SQ
16d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
16db0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
16dc0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
16dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
16de0 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65  TY;.    goto cre
16df0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
16e00 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tion;.  }.  rc =
16e10 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
16e20 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
16e30 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
16e40 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63  ge[0]);.  if( rc
16e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16e60 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63     goto create_c
16e70 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b  ursor_exception;
16e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
16e90 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
16ea0 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
16eb0 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
16ec0 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
16ed0 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69  ** variables, li
16ee0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
16ef0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
16f00 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70  list and set *pp
16f10 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75  Cur (the.  ** ou
16f20 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  tput argument to
16f30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e   this function).
16f40 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b  .  */.  pCur->pK
16f50 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
16f60 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
16f70 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
16f80 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
16f90 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77  ->wrFlag = (u8)w
16fa0 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70  rFlag;.  pCur->p
16fb0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
16fc0 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  sor;.  if( pCur-
16fd0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43  >pNext ){.    pC
16fe0 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
16ff0 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70   = pCur;.  }.  p
17000 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
17010 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
17020 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
17030 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63  LID;.  pCur->cac
17040 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20  hedRowid = 0;.. 
17050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17060 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f  K;..create_curso
17070 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72  r_exception:.  r
17080 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
17090 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75  >apPage[0]);.  u
170a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
170b0 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72  ed(pBt);.  retur
170c0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
170d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
170e0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17110 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
17120 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
17150 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
17160 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
17170 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
171a0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
171b0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
171c0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
171d0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
171e0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
171f0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
17200 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
17210 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
17240 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
17250 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
17260 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17270 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
17280 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
17290 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
172a0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
172b0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
172c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
172d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
172e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
172f0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
17300 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
17310 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
17320 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
17330 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
17340 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
17350 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
17360 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
17370 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
17380 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
17390 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
173a0 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
173b0 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
173c0 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
173d0 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
173e0 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
173f0 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
17400 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
17410 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
17420 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
17430 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
17440 73 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  sor);.}../*.** S
17450 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
17460 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
17470 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
17480 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
17490 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
174a0 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
174b0 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
174c0 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
174d0 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
174e0 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
174f0 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
17500 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
17510 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
17520 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
17530 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
17540 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
17550 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
17560 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
17570 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
17580 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
17590 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
175a0 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
175b0 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
175c0 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
175d0 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
175e0 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
175f0 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
17600 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
17610 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
17620 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
17630 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
17640 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
17650 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
17660 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
17670 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
17680 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
17690 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
176a0 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
176b0 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
176c0 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
176d0 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
176e0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
176f0 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
17700 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
17710 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
17720 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
17730 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
17740 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
17750 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
17760 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
17770 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
17780 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17790 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
177a0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
177b0 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
177c0 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
177d0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
177e0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
177f0 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
17800 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
17810 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
17820 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
17830 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
17840 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
17850 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
17860 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
17870 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
17880 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
17890 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
178a0 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
178b0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
178c0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
178d0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
178e0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
178f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17900 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
17910 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
17920 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
17930 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17940 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
17950 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
17960 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
17970 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
17980 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
17990 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
179a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
179b0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
179c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
179d0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d  Btree);.    pBt-
179e0 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
179f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
17a00 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
17a10 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
17a20 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
17a30 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
17a40 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
17a50 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
17a60 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
17a70 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
17a80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17a90 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
17aa0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
17ab0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
17ac0 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
17ad0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
17ae0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
17af0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17b00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
17b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
17b20 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
17b30 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
17b40 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
17b50 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
17b60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
17b70 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
17b80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
17b90 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
17ba0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17bb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74  ../*.** Make a t
17bc0 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
17bd0 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  by filling in th
17be0 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d  e fields of pTem
17bf0 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d  pCur..** The tem
17c00 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73  porary cursor is
17c10 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73   not on the curs
17c20 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20  or list for the 
17c30 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  Btree..*/.void s
17c40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
17c50 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
17c60 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f  r *pCur, BtCurso
17c70 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20  r *pTempCur){.  
17c80 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
17c90 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
17ca0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
17cb0 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
17cc0 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72  ur, sizeof(BtCur
17cd0 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  sor));.  pTempCu
17ce0 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
17cf0 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
17d00 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
17d10 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61  i<=pTempCur->iPa
17d20 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  ge; i++){.    sq
17d30 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
17d40 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  empCur->apPage[i
17d50 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ]->pDbPage);.  }
17d60 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70  .  assert( pTemp
17d70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a  Cur->pKey==0 );.
17d80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
17d90 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
17da0 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
17db0 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
17dc0 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
17dd0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
17de0 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
17df0 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
17e00 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
17e10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
17e20 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
17e30 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
17e40 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28  (pCur) );.  for(
17e50 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
17e60 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
17e70 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
17e80 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
17e90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
17ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17eb0 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 0a 0a  Cur->pKey);.}...
17ec0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17ed0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
17ee0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
17ef0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
17f00 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
17f10 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
17f20 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
17f30 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
17f40 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
17f50 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
17f60 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
17f70 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
17f80 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
17f90 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
17fa0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
17fb0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
17fc0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
17fd0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
17fe0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  to sqlite3BtreeP
17ff0 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
18000 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
18010 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
18020 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
18030 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
18040 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
18050 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
18060 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
18070 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
18080 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
18090 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
180a0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
180b0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
180c0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
180d0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
180e0 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
180f0 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
18100 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
18110 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
18120 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
18130 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
18140 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
18150 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
18160 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
18170 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
18180 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
18190 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
181a0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
181b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
181c0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
181d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
181e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
181f0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
18200 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
18210 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
18220 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
18230 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18240 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
18250 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
18260 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
18270 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
18280 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69  ssert( memcmp(&i
18290 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
182a0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
182b0 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
182c0 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
182d0 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
182e0 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
182f0 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
18300 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
18310 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
18320 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
18330 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
18340 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
18350 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
18360 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
18370 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
18380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
18390 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
183a0 50 61 67 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Page;.      sqli
183b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
183c0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
183d0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
183e0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
183f0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
18400 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
18410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18420 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
18430 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
18440 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
18450 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
18460 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
18470 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
18480 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
18490 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
184a0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
184b0 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
184c0 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
18500 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
18510 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18540 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
18550 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
18560 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18590 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
185a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
185b0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
185c0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
185d0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
185e0 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
185f0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
18600 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
18610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
18640 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
18690 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
186a0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
186e0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
186f0 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
18700 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
18710 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
18720 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
18730 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
18740 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
18750 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
18760 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
18770 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
18780 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
18790 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
187a0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
187b0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
187c0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
187d0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
187e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
187f0 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
18800 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
18810 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
18820 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
18830 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
18840 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18850 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
18860 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18870 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
18880 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
18890 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
188a0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
188b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
188c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
188d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
188e0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
188f0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
18900 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18910 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18920 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
18930 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
18940 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
18950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
18960 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
18970 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
18980 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
18990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
189a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
189b0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
189c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
189d0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
189e0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
189f0 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
18a00 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
18a10 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
18a20 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
18a30 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
18a40 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
18a50 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
18a60 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
18a70 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
18a80 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
18a90 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
18aa0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
18ab0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
18ac0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
18ad0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18ae0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
18af0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
18b00 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
18b10 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18b20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
18b30 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
18b40 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
18b50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
18b60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
18b80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18b90 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
18ba0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18bb0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
18bc0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
18bd0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
18be0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
18bf0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
18c00 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
18c10 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
18c20 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
18c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18c40 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
18c50 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
18c60 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
18c70 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
18c80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18c90 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
18ca0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
18cb0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
18cc0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18cd0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
18ce0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
18cf0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
18d00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
18d10 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
18d20 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
18d30 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
18d40 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
18d50 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
18d60 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
18d70 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
18d80 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
18d90 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
18da0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
18db0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
18dc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
18dd0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
18de0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
18df0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
18e00 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
18e10 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
18e20 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
18e30 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
18e40 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
18e50 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
18e60 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
18e70 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
18e80 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
18e90 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
18ea0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
18eb0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
18ec0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
18ed0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
18ee0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
18ef0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
18f00 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
18f10 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
18f20 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
18f30 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
18f40 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
18f50 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
18f60 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
18f70 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
18f80 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
18f90 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
18fa0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
18fb0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
18fc0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
18fd0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
18fe0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
18ff0 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
19000 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
19010 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
19020 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
19030 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
19040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
19050 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
19060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
19070 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
190a0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
190b0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
190c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
190d0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
190e0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
190f0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
19100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
19110 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
19120 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
19130 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
19140 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
19150 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
19160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19170 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19180 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19190 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
191a0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
191b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
191c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
191d0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
191e0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
191f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
19200 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
19210 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
19220 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
19230 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
19240 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
19250 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
19260 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
19270 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
19280 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
19290 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
192a0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
192b0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
192c0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
192d0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
192e0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
192f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
19300 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
19310 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19320 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
19330 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
19340 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
19350 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
19360 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
19370 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
19380 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
19390 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
193a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
193b0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
193c0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61    if( iGuess<=pa
193d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
193e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
193f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
19400 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
19410 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
19420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19430 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
19440 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
19450 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
19460 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
19470 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
19480 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
19490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
194a0 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ndif..  if( rc==
194b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
194c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
194d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
194e0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
194f0 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d 3d  .    assert(rc==
19500 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
19510 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28 20  ge==0);.    if( 
19520 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53  next==0 && rc==S
19530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19540 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
19550 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
19560 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
19570 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
19580 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
19590 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
195a0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
195b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
195c0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
195d0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
195e0 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
195f0 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
19600 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
19610 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
19620 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
19630 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
19640 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
19650 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
19660 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
19670 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
19680 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
19690 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
196a0 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
196b0 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
196c0 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
196d0 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
196e0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
196f0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
19700 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
19710 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19720 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
19730 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
19740 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
19750 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
19760 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
19770 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
19780 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
19790 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
197a0 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
197b0 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
197c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
197d0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
197e0 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
197f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
19800 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
19810 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
19820 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
19830 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
19840 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
19850 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
19860 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19870 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
19880 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
198a0 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
198b0 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
198c0 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
198d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
198e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
198f0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
19900 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
19910 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
19920 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
19930 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
19940 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
19950 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
19960 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19970 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
19980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19990 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
199a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
199b0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
199c0 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
199d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
199e0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
199f0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
19a00 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
19a10 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
19a20 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
19a30 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
19a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
19a60 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
19a70 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
19a80 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
19a90 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
19aa0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
19ab0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
19ac0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
19ad0 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
19ae0 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
19af0 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
19b00 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
19b10 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
19b20 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
19b30 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
19b40 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
19b50 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
19b60 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
19b70 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
19b80 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
19b90 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
19ba0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
19bb0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
19bc0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
19bd0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
19be0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
19bf0 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
19c00 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
19c10 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
19c20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72  It just reads or
19c30 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72   writes bytes fr
19c40 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
19c50 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
19c60 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74   .** appear on t
19c70 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
19c80 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
19c90 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
19ca0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e  rflow .** pages.
19cb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
19cc0 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
19cd0 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
19ce0 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
19cf0 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
19d00 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
19d10 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
19d20 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
19d30 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
19d40 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
19d50 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
19d60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
19d70 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
19d80 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
19d90 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
19da0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
19db0 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
19dc0 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
19dd0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
19de0 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
19df0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
19e00 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
19e10 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
19e20 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
19e30 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
19e40 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
19e50 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
19e60 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
19e70 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
19e80 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
19e90 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
19ea0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
19eb0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
19ec0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
19ed0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
19ee0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
19ef0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
19f00 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
19f10 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
19f20 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
19f30 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
19f40 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
19f50 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
19f60 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
19f70 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
19f80 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
19f90 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
19fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
19fb0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
19fc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
19fd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
19fe0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
19ff0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1a000 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
1a010 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
1a020 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
1a030 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
1a040 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
1a050 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
1a060 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
1a070 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a080 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
1a090 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
1a0a0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
1a0b0 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20    int skipKey,  
1a0c0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
1a0d0 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
1a0e0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1a0f0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  */.  int eOp    
1a100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
1a110 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
1a120 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
1a130 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
1a140 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
1a150 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a160 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
1a170 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
1a180 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1a190 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1a1a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
1a1b0 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
1a1c0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
1a1d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a1e0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a200 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
1a210 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
1a220 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1a230 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
1a240 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a250 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a260 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1a270 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1a280 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1a290 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1a2a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1a2b0 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49  ) );..  getCellI
1a2c0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
1a2d0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
1a2e0 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d  fo.pCell + pCur-
1a2f0 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
1a300 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e   nKey = (pPage->
1a310 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e  intKey ? 0 : (in
1a320 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
1a330 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b  y);..  if( skipK
1a340 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74  ey ){.    offset
1a350 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20   += nKey;.  }.  
1a360 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e  if( offset+amt >
1a370 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
1a380 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20 26 61  .nData .   || &a
1a390 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1a3a0 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50  fo.nLocal] > &pP
1a3b0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
1a3c0 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b  usableSize].  ){
1a3d0 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
1a3e0 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1a3f0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
1a400 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
1a410 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a430 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
1a440 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
1a450 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
1a460 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
1a470 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
1a480 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
1a490 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
1a4a0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
1a4b0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
1a4c0 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
1a4d0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1a4e0 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
1a4f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
1a500 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
1a510 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1a520 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1a530 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
1a540 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
1a550 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
1a560 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
1a570 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
1a580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
1a590 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
1a5a0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
1a5b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a5c0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
1a5d0 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
1a5e0 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
1a5f0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
1a600 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
1a610 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
1a620 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
1a630 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
1a640 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
1a650 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
1a660 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
1a670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a680 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
1a690 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
1a6a0 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
1a6b0 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
1a6c0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
1a6d0 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
1a6e0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1a6f0 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
1a700 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
1a710 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
1a720 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
1a730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1a740 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1a750 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
1a760 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1a770 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
1a780 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
1a790 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
1a7a0 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
1a7b0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
1a7c0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
1a7d0 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
1a7e0 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
1a7f0 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
1a800 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
1a810 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1a820 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
1a830 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
1a840 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1a850 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
1a860 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
1a870 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
1a880 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
1a890 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
1a8a0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1a8b0 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
1a8c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1a8d0 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
1a8e0 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vfl);.      if( 
1a8f0 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e  nOvfl && !pCur->
1a900 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1a910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a920 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1a930 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a940 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1a950 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
1a960 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1a970 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
1a980 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1a990 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
1a9a0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
1a9b0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
1a9c0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
1a9d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a9e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1a9f0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
1aa00 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
1aa10 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
1aa20 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
1aa30 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
1aa40 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
1aa50 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
1aa60 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
1aa70 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
1aa80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1aa90 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
1aaa0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1aab0 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
1aac0 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
1aad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1aae0 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
1aaf0 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
1ab00 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
1ab10 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1ab20 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
1ab30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1ab40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1ab50 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
1ab60 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
1ab70 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1ab80 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
1ab90 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
1aba0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
1abb0 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
1abc0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
1abd0 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
1abe0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
1abf0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
1ac00 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
1ac10 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
1ac20 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
1ac30 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
1ac40 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1ac50 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
1ac60 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
1ac70 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
1ac80 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
1ac90 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
1aca0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
1acb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
1acc0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
1acd0 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
1ace0 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
1acf0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
1ad00 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
1ad10 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
1ad20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ad30 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
1ad40 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1ad50 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1ad60 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1ad70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1ad80 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
1ad90 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
1ada0 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
1adb0 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
1adc0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
1add0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
1ade0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
1adf0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
1ae00 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
1ae10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ae20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
1ae30 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
1ae40 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
1ae50 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
1ae60 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
1ae70 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
1ae80 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
1ae90 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
1aea0 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
1aeb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1aec0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
1aed0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
1aee0 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63   amt;.        rc
1aef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1af00 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
1af10 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
1af20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
1af30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1af40 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61 79  {.          aPay
1af50 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
1af60 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
1af70 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ge);.          n
1af80 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1af90 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
1afa0 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
1afb0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
1afc0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1afd0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
1afe0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
1aff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
1b000 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
1b010 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
1b020 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  4], pBuf, a, eOp
1b030 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
1b040 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1b050 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
1b060 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66 73  ;.          offs
1b070 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
1b080 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
1b090 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
1b0a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b0b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1b0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b0d0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1b0e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b0f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b100 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b110 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1b120 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
1b130 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1b140 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1b150 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1b160 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1b170 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1b180 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1b190 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1b1a0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
1b1b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1b1c0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
1b1d0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
1b1e0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1b1f0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
1b200 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
1b210 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
1b220 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
1b230 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
1b240 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1b250 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72  e3BtreeKey(BtCur
1b260 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
1b270 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
1b280 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
1b290 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1b2a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b2b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1b2c0 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1b2d0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1b2e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b2f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1b300 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1b310 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1b320 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1b330 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1b340 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1b350 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
1b360 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  if( pCur->apPage
1b370 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
1b380 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b390 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1b3a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1b3b0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1b3c0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1b3d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b3e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1b3f0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
1b400 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1b410 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
1b420 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
1b430 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
1b440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b450 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1b460 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
1b470 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
1b480 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
1b490 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
1b4a0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
1b4b0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
1b4c0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
1b4d0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
1b4e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1b4f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1b500 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
1b510 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
1b520 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
1b530 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
1b540 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
1b550 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
1b560 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
1b570 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
1b580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b590 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
1b5a0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1b5b0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1b5c0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1b5d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1b5e0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1b5f0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
1b600 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1b610 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1b620 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
1b630 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
1b640 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1b650 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1b660 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1b670 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1b680 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1b6a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1b6b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1b6c0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1b6d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1b6e0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1b6f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1b700 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b710 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1b720 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1b730 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1b740 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
1b750 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
1b760 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1b770 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a  t, pBuf, 1, 0);.
1b780 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b790 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b7a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1b7b0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1b7c0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
1b7d0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
1b7e0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
1b7f0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
1b800 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
1b810 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
1b820 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
1b830 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
1b840 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
1b850 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
1b860 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
1b870 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
1b880 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
1b890 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
1b8a0 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
1b8b0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
1b8c0 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
1b8d0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
1b8e0 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
1b8f0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
1b900 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1b910 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
1b920 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
1b930 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
1b940 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
1b950 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
1b960 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
1b970 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
1b980 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
1b990 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
1b9a0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
1b9b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1b9c0 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
1b9d0 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
1b9e0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
1b9f0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
1ba00 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
1ba10 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
1ba20 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
1ba30 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
1ba40 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
1ba50 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
1ba60 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
1ba70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
1ba80 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
1ba90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1baa0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
1bab0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
1bac0 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
1bad0 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
1bae0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1baf0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
1bb00 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
1bb10 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
1bb20 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
1bb30 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1bb40 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1bb50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1bb60 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
1bb70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1bb80 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
1bb90 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
1bba0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
1bbb0 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
1bbc0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1bbd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
1bbe0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
1bbf0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
1bc00 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
1bc10 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
1bc20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1bc30 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
1bc40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1bc50 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
1bc60 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
1bc70 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f   nKey;.  u32 nLo
1bc80 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
1bc90 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
1bca0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
1bcb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1bcc0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
1bcd0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1bce0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1bcf0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1bd00 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1bd10 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
1bd20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1bd30 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
1bd40 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1bd50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1bd60 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67  ge->nCell );.  g
1bd70 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1bd80 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1bd90 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
1bda0 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
1bdb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1bdc0 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
1bdd0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
1bde0 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
1bdf0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74  .    nKey = (int
1be00 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1be10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
1be20 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
1be30 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
1be40 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
1be50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
1be60 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
1be70 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
1be80 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
1be90 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79   if( nLocal>nKey
1bea0 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c   ){.      nLocal
1beb0 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20   = nKey;.    }. 
1bec0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
1bed0 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
1bee0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
1bef0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
1bf00 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
1bf10 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
1bf20 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
1bf30 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
1bf40 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
1bf50 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
1bf60 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
1bf70 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
1bf80 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1bf90 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
1bfa0 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
1bfb0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
1bfc0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
1bfd0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
1bfe0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
1bff0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
1c000 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
1c010 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
1c020 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
1c030 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
1c040 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
1c050 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
1c060 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
1c070 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
1c080 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
1c090 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1c0a0 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
1c0b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
1c0c0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
1c0d0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
1c0e0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
1c0f0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
1c100 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
1c110 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
1c120 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
1c130 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
1c140 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
1c150 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1c160 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
1c170 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c180 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c190 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1c1a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1c1b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1c1c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1c1d0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1c1e0 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
1c1f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
1c200 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1c210 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
1c220 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1c230 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1c240 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1c250 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1c260 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1c270 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1c280 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1c290 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1c2a0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1c2b0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
1c2c0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
1c2d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1c2e0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
1c2f0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
1c300 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
1c310 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
1c320 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
1c330 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
1c340 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
1c350 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
1c360 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c370 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
1c380 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
1c390 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
1c3a0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
1c3b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1c3c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
1c3d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1c3e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1c3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1c400 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1c410 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1c420 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1c430 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
1c440 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
1c450 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
1c460 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
1c470 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1c480 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c490 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
1c4a0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
1c4b0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
1c4c0 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
1c4d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1c4e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
1c4f0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
1c500 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
1c510 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
1c520 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
1c530 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1c540 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1c550 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
1c560 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
1c570 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c590 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
1c5a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1c5b0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1c5c0 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
1c5d0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
1c5e0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
1c5f0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
1c600 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
1c610 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
1c620 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
1c630 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
1c640 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
1c650 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
1c660 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
1c670 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
1c680 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
1c690 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
1c6a0 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
1c6b0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
1c6c0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
1c6d0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
1c6e0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1c6f0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
1c700 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
1c710 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
1c720 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
1c730 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
1c740 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
1c750 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
1c760 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
1c770 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
1c780 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
1c790 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
1c7a0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
1c7b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
1c7c0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
1c7d0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
1c7e0 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
1c7f0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
1c800 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
1c810 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
1c820 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1c830 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1c840 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1c850 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1c860 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1c870 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1c880 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1c890 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1c8a0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1c8b0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1c8c0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1c8d0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1c8e0 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1c8f0 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1c900 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1c910 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1c920 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1c930 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c940 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1c950 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1c960 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
1c970 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c980 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c990 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c9a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c9b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c9c0 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
1c9d0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1c9e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1c9f0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
1ca00 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
1ca10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ca20 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1ca30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ca40 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
1ca50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ca60 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
1ca70 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1ca80 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
1ca90 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
1caa0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
1cab0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1cac0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1cad0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
1cae0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1caf0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1cb00 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1cb10 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1cb20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1cb30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1cb40 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1cb50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
1cb60 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
1cb70 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
1cb80 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1cb90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1cba0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1cbb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1cbc0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
1cbd0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1cbe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1cbf0 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
1cc00 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1cc10 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1cc20 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
1cc30 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1cc40 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
1cc50 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
1cc60 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
1cc70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1cc80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
1cc90 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
1cca0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
1ccb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ccc0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1ccd0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
1cce0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
1ccf0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
1cd00 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d      for(i=1; i<=
1cd10 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
1cd20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1cd30 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1cd40 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e[i]);.    }.  }
1cd50 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1cd60 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1cd70 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1cd80 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1cd90 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
1cda0 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20  >apPage[0])).   
1cdb0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1cdc0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1cdd0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1cde0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cdf0 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70    }..  pRoot = p
1ce00 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
1ce10 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
1ce20 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1ce30 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d  oRoot );.  pCur-
1ce40 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 43  >iPage = 0;.  pC
1ce50 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
1ce60 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1ce70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1ce80 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1ce90 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1cea0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
1ceb0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
1cec0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
1ced0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
1cee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1cef0 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20  ot->pgno==1 );. 
1cf00 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
1cf10 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
1cf20 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
1cf30 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
1cf40 73 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20  sert( subpage>0 
1cf50 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
1cf60 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
1cf70 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
1cf80 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
1cf90 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
1cfa0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
1cfb0 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43  te = ((pRoot->nC
1cfc0 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41  ell>0)?CURSOR_VA
1cfd0 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c  LID:CURSOR_INVAL
1cfe0 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ID);.  }.  retur
1cff0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1d000 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1d010 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
1d020 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1d030 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
1d040 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
1d050 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1d060 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1d070 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1d080 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1d090 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
1d0a0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
1d0b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1d0c0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1d0d0 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
1d0e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1d0f0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1d100 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d110 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1d120 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1d130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1d160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d170 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1d180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1d190 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
1d1a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1d1b0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
1d1c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1d1d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1d1e0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1d1f0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
1d200 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1d210 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
1d220 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
1d230 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
1d240 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
1d250 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
1d260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
1d270 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
1d280 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
1d290 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1d2a0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
1d2b0 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
1d2c0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1d2d0 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
1d2e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
1d2f0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
1d300 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
1d310 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
1d320 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
1d330 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
1d340 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
1d350 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
1d360 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
1d370 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
1d380 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
1d390 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
1d3a0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
1d3b0 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
1d3c0 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
1d3d0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
1d3e0 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
1d3f0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
1d400 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
1d410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1d420 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
1d430 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1d440 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1d450 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d460 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1d470 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
1d480 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1d490 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1d4a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d4b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d4c0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1d4d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d4e0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1d4f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1d500 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
1d510 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1d520 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1d530 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1d540 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1d550 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1d560 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
1d570 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1d580 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1d590 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
1d5a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d5b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1d5c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
1d5d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
1d5e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1d5f0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1d600 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1d610 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1d620 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1d630 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1d640 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1d650 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1d660 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1d670 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1d680 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1d690 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1d6a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1d6b0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1d6c0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1d6d0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1d6e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d6f0 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
1d700 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1d710 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1d720 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d730 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d740 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1d750 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d760 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d770 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d780 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1d790 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1d7a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d7b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1d7c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1d7d0 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
1d7e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1d7f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1d800 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1d810 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d820 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d830 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1d840 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1d850 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d860 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
1d870 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1d880 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1d890 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d8a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1d8b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d8c0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1d8d0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1d8e0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1d8f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1d900 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1d910 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1d920 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1d930 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1d940 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1d950 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1d960 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1d970 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1d980 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
1d990 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1d9a0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1d9b0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
1d9c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d9d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d9e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d9f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1da00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1da10 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1da20 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1da30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da40 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
1da50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1da60 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1da70 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1da80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1da90 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1daa0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1dab0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1dac0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1dad0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1dae0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
1daf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1db00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1db10 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1db20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1db30 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1db40 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1db50 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
1db60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1db70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
1db80 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
1db90 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
1dba0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
1dbb0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
1dbc0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
1dbd0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
1dbe0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
1dbf0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
1dc00 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
1dc10 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
1dc20 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
1dc30 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
1dc40 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
1dc50 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
1dc60 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
1dc70 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
1dc80 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1dc90 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
1dca0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
1dcb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
1dcc0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
1dcd0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
1dce0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
1dcf0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
1dd00 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
1dd10 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
1dd20 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
1dd30 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
1dd40 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
1dd50 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
1dd60 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
1dd70 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
1dd80 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
1dd90 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
1dda0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
1ddb0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
1ddc0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
1ddd0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
1dde0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
1ddf0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
1de00 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
1de10 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
1de20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1de30 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
1de40 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1de50 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1de60 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
1de90 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
1dea0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
1deb0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
1ded0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
1dee0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
1def0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
1df00 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
1df10 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
1df20 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1df30 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1df40 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1df50 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
1df60 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
1df70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
1df80 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
1df90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1dfa0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1dfb0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
1dfe0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
1dff0 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
1e000 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
1e010 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
1e020 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
1e030 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1e040 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
1e050 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1e060 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
1e070 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
1e080 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
1e090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e0a0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
1e0b0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
1e0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1e0d0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
1e0e0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
1e0f0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
1e100 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
1e110 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
1e120 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
1e130 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1e140 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1e150 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e160 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1e170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e180 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1e190 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1e1a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1e1b0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
1e1c0 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
1e1d0 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
1e1e0 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
1e1f0 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
1e200 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
1e210 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
1e220 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1e230 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e240 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64  D && pCur->valid
1e250 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72  NKey .   && pCur
1e260 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1e270 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
1e280 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
1e290 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
1e2a0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e2b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e2c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e2d0 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
1e2e0 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
1e2f0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
1e300 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1e310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e320 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1e330 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
1e340 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
1e350 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1e360 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1e370 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1e380 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1e390 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1e3a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e3b0 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
1e3c0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1e3d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1e3e0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
1e3f0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
1e400 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1e410 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1e420 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
1e430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e440 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1e450 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
1e460 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
1e470 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
1e480 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b     int lwr, upr;
1e490 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
1e4a0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
1e4b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1e4c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e4d0 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1e4e0 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1e4f0 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1e500 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1e510 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1e520 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1e530 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1e540 20 28 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79   (!pPage->intKey
1e550 20 26 26 20 70 49 64 78 4b 65 79 3d 3d 30 29 20   && pIdxKey==0) 
1e560 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20 20 20 20  || upr<0 ){.    
1e570 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1e580 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e590 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1e5a0 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
1e5b0 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
1e5c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
1e5d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1e5e0 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20 20 20  = (u16)upr;.    
1e5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1e600 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1e610 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 75  Page] = (u16)((u
1e620 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20  pr+lwr)/2);.    
1e630 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  }.    for(;;){. 
1e640 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1e650 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1e660 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69  CellKey;.      i
1e670 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
1e680 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1e690 5d 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ];.      pCur->i
1e6a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1e6b0 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1e6c0 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
1e6d0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
1e6e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  y ){.        u8 
1e6f0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pCell;.        
1e700 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1e710 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
1e720 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
1e730 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
1e740 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
1e750 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1e760 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
1e770 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
1e780 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
1e790 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
1e7a0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
1e7b0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
1e7c0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1e7d0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
1e7e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1e7f0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
1e800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
1e810 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
1e820 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
1e830 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1e840 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1e850 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
1e860 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1e870 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1e880 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1e890 20 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c         int avail
1e8a0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43  able;.        pC
1e8b0 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a  ellKey = (void *
1e8c0 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
1e8d0 75 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20  ur, &available, 
1e8e0 30 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c  0);.        nCel
1e8f0 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  lKey = pCur->inf
1e900 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
1e910 69 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e  if( available>=n
1e920 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20  CellKey ){.     
1e930 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
1e940 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e950 65 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  e((int)nCellKey,
1e960 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
1e970 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
1e980 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
1e990 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
1e9a0 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 6e 43 65  Malloc( (int)nCe
1e9b0 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  llKey );.       
1e9c0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
1e9d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e9e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1e9f0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
1ea00 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1ea10 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
1ea20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ea30 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
1ea40 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43  pCur, 0, (int)nC
1ea50 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 2a 29 70  ellKey, (void*)p
1ea60 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1ea70 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1ea80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ea90 28 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20  ((int)nCellKey, 
1eaa0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
1eab0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
1eac0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
1ead0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1eae0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
1eaf0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1eb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1eb10 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
1eb20 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1eb30 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1eb40 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1eb50 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
1eb60 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1eb70 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1eb80 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
1eb90 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a   upr = lwr - 1;.
1eba0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1ebb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1ebc0 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
1ebd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
1ebe0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1ebf0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1ec00 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1ec10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ec20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
1ec30 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
1ec40 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
1ec50 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
1ec60 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
1ec70 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
1ec80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1ec90 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
1eca0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
1ecb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ecc0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
1ecd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
1ece0 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f  (u16)((lwr+upr)/
1ecf0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  2);.    }.    as
1ed00 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
1ed10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ed20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1ed30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1ed40 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
1ed50 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
1ed60 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
1ed70 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1ed80 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1ed90 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1eda0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1edb0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
1edc0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
1edd0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
1ede0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
1edf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ee00 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
1ee10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ee20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ee30 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1ee40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1ee50 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69  nCell );.      i
1ee60 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20  f( pRes ) *pRes 
1ee70 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
1ee80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ee90 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1eea0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
1eeb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1eec0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
1eed0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
1eee0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1eef0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1ef00 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
1ef10 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1ef20 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
1ef30 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
1ef40 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
1ef50 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
1ef60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ef70 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
1ef80 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76  sion of BtreeMov
1ef90 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70  eto, pKey is a p
1efa0 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f  acked index reco
1efb0 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73  rd.** such as is
1efc0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
1efd0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1efe0 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20  opcode.  Unpack 
1eff0 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e  the.** record an
1f000 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65  d then call Btre
1f010 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1f020 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  ) to do the work
1f030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f040 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  BtreeMoveto(.  B
1f050 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1f060 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
1f070 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74  n on the btree t
1f080 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
1f090 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1f0a0 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64  Key,   /* Packed
1f0b0 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65   key if the btre
1f0c0 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  e is an index */
1f0d0 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
1f0e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
1f0f0 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  r key for tables
1f100 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20  .  Size of pKey 
1f110 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  for indices */. 
1f120 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20   int bias,      
1f130 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61       /* Bias sea
1f140 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
1f150 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
1f160 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  es           /* 
1f170 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
1f180 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
1f190 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f1b0 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20  Status code */. 
1f1c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1f1d0 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55  *pIdxKey;   /* U
1f1e0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
1f1f0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1f200 65 63 6f 72 64 20 61 53 70 61 63 65 5b 31 36 5d  ecord aSpace[16]
1f210 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20  ; /* Temp space 
1f220 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f  for pIdxKey - to
1f230 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20   avoid a malloc 
1f240 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  */..  if( pKey )
1f250 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
1f260 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
1f270 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
1f280 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  y = sqlite3VdbeR
1f290 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
1f2a0 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
1f2b0 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20  )nKey, pKey,.   
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
1f2f0 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
1f300 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
1f310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f320 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
1f330 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
1f340 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1f350 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
1f360 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
1f370 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
1f380 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b   pRes);.  if( pK
1f390 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
1f3a0 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
1f3b0 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65  kedRecord(pIdxKe
1f3c0 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
1f3d0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1f3e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1f3f0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1f400 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1f410 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
1f420 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
1f430 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
1f440 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
1f450 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1f460 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
1f470 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
1f480 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
1f490 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
1f4a0 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
1f4b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
1f4c0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
1f4d0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
1f4e0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1f4f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f500 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
1f510 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
1f520 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
1f530 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
1f540 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
1f550 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
1f560 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
1f570 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
1f580 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
1f590 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
1f5a0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1f5b0 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
1f5c0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
1f5d0 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
1f5e0 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
1f5f0 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
1f600 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
1f610 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
1f620 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
1f630 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75 72 73  andle for a curs
1f640 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  or..*/.sqlite3 *
1f650 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1f660 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43 75 72  orDb(const BtCur
1f670 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1f680 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f690 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1f6a0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1f6b0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ) );.  return pC
1f6c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  ur->pBtree->db;.
1f6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
1f6e0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1f6f0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
1f700 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1f710 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
1f720 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1f730 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
1f740 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
1f750 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
1f760 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1f770 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1f780 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1f790 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1f7a0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1f7b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f7c0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
1f7d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1f7e0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1f7f0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
1f800 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1f810 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f820 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f830 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1f840 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1f850 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
1f860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f870 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1f880 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
1f890 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
1f8a0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1f8b0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1f8c0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1f8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1f8e0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1f8f0 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  kip>0 ){.    pCu
1f900 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1f910 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1f920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f930 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1f940 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1f950 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1f960 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1f970 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
1f980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1f990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f9a0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1f9b0 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67  ssert( idx<=pPag
1f9c0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
1f9d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1f9e0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1f9f0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1fa00 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
1fa10 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
1fa20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1fa30 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1fa40 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
1fa50 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1fa60 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1fa70 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
1fa80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fa90 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
1faa0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1fab0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
1fac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1fad0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1fae0 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
1faf0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
1fb00 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
1fb10 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
1fb20 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1fb30 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1fb40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fb50 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
1fb60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
1fb70 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
1fb80 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
1fb90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1fba0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1fbb0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
1fbc0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1fbd0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1fbe0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1fbf0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1fc00 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1fc10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1fc20 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
1fc30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1fc40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fc50 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
1fc60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1fc70 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
1fc80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1fc90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fca0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
1fcb0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
1fcc0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
1fcd0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
1fce0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
1fcf0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
1fd00 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
1fd10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1fd20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
1fd30 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
1fd40 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
1fd50 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
1fd60 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
1fd70 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
1fd80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1fd90 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1fda0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1fdb0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1fdc0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1fdd0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
1fde0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1fdf0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1fe00 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1fe10 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1fe20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1fe30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1fe40 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
1fe50 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1fe60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fe70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1fe80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
1fe90 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1fea0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1feb0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1fec0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1fed0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1fee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1fef0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20  f( pCur->skip<0 
1ff00 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1ff10 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1ff20 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1ff30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ff40 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1ff50 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
1ff60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ff70 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
1ff80 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1ff90 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
1ffa0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
1ffb0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
1ffc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
1ffd0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1ffe0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
1fff0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
20000 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
20010 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20020 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20030 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
20040 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
20050 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
20060 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
20070 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
20080 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
20090 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
200a0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
200b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
200c0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
200d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
200e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
200f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
20100 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
20110 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
20120 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
20130 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20140 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20150 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
20160 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20170 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
20180 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
20190 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
201a0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
201b0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
201c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
201d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
201e0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
201f0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
20200 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20220 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
20230 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20240 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
20250 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
20260 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20270 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
20280 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
20290 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
202a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
202b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
202c0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
202d0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
202e0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
202f0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
20300 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
20310 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
20320 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
20330 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
20340 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
20350 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20360 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
20370 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
20380 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
20390 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
203a0 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
203b0 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
203c0 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
203d0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
203e0 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
203f0 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
20400 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
20410 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
20420 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
20430 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
20440 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
20450 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
20460 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
20470 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
20480 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
20490 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
204a0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
204b0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
204c0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
204d0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
204e0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
204f0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
20500 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
20510 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
20520 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
20530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20540 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
20550 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
20560 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
20570 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
20580 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
20590 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
205a0 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
205b0 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
205c0 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
205d0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
205e0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
205f0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
20600 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
20610 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
20620 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
20630 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
20640 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
20650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
20660 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
20670 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
20680 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
20690 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
206a0 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
206b0 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
206c0 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
206d0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
206e0 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 2f  ;.  int n;     /
206f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20700 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
20710 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20 20  t */.  int k;   
20720 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
20730 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
20740 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
20750 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
20760 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
20770 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
20780 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  nk = 0;..  asser
20790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
207a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
207b0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
207c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6e  pBt->pPage1;.  n
207d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
207e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
207f0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
20800 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
20810 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
20820 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
20830 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
20840 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
20850 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
20860 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
20870 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
20880 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
20890 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
208a0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
208b0 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
208c0 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
208d0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
208e0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
208f0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
20900 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
20910 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
20920 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
20930 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
20940 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
20950 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
20960 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
20970 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
20980 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20990 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
209a0 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67 65   && nearby<=page
209b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
209c0 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
209d0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
209e0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
209f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
20a00 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
20a10 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
20a20 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
20a30 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
20a40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20a50 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
20a60 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
20a70 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
20a80 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
20a90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20aa0 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
20ab0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
20ac0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
20ad0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
20ae0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
20af0 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
20b00 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
20b10 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
20b20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
20b30 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
20b40 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
20b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20b60 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
20b70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
20b80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20b90 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
20ba0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
20bb0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
20bc0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
20bd0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
20be0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
20bf0 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
20c00 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
20c10 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
20c20 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
20c30 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
20c40 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
20c50 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
20c60 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
20c70 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
20c80 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
20c90 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
20ca0 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
20cb0 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
20cc0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
20cd0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
20ce0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
20cf0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
20d00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20d10 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
20d20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
20d30 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
20d40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20d50 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
20d60 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
20d70 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nk, 0);.      if
20d80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
20d90 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
20da0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
20db0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
20dc0 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
20dd0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
20de0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
20df0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
20e00 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
20e10 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
20e20 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
20e30 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
20e40 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
20e50 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
20e60 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
20e70 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
20e80 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
20e90 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
20ea0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
20eb0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
20ec0 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
20ed0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
20ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20ef0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
20f00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20f10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20f20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
20f30 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
20f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
20f50 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
20f60 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
20f70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
20f80 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
20f90 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
20fa0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
20fb0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
20fc0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
20fd0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
20fe0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
20ff0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
21000 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
21010 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
21020 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65  f( k>pBt->usable
21030 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
21040 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
21050 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
21060 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
21070 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
21080 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21090 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
210a0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
210b0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
210c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
210d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
210e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
210f0 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72  archList && near
21100 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20  by==iTrunk ){.  
21110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
21120 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
21130 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
21140 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
21150 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
21160 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
21170 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
21180 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
21190 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
211a0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
211b0 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20  no==iTrunk );.  
211c0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
211d0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
211e0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
211f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21200 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
21210 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
21220 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
21230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
21240 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
21250 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
21260 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
21270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21280 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
21290 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
212a0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
212b0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
212c0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
212d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
212e0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
212f0 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
21300 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
21310 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
21320 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21340 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
21350 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
21360 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
21370 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
21380 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
21390 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
213a0 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
213b0 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
213c0 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
213d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
213e0 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
213f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21400 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
21410 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
21420 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
21430 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
21440 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
21450 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21460 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
21470 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
21480 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
21490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
214a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
214b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
214c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
214d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
214e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
214f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
21500 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
21510 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
21520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21540 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
21550 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
21560 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
21570 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
21580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21590 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
215a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
215b0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
215c0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
215d0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
215e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
215f0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
21600 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
21610 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
21620 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
21630 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
21640 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21650 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
21660 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
21670 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
21680 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
21690 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
216a0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
216b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
216c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
216d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
216e0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
216f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
21700 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
21720 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
21730 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21740 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
21760 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
21770 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
21780 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
21790 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
217a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
217b0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
217c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
217d0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
217e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
217f0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
21800 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
21810 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
21820 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
21830 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
21840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
21850 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
21860 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
21870 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f  .        int clo
21880 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
21890 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
218a0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
218b0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
218c0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
218d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
218e0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
218f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21900 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
21910 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
21920 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
21930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21940 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
21950 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20           int i, 
21960 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
21970 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
21980 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65         dist = ge
21990 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
219a0 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  ) - nearby;.    
219b0 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30        if( dist<0
219c0 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b   ) dist = -dist;
219d0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
219e0 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
219f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
21a00 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  2 = get4byte(&aD
21a10 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
21a20 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
21a30 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20    if( d2<0 ) d2 
21a40 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20  = -d2;.         
21a50 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
21a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21a70 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
21a80 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
21a90 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
21aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21ab0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
21ac0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
21ad0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
21ae0 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
21af0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
21b00 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
21b10 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
21b20 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65  rchList || iPage
21b30 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20  ==nearby ){.    
21b40 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
21b50 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50  ent;.          P
21b60 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  gno nPage;.     
21b70 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50       *pPgno = iP
21b80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  age;.          n
21b90 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
21ba0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
21bb0 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
21bc0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
21bd0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
21be0 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
21bf0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
21c00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21c10 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21c20 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
21c30 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
21c40 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
21c50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
21c60 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
21c70 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
21c80 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
21c90 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
21ca0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
21cb0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
21cd0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
21ce0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
21cf0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
21d00 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
21d10 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
21d20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
21d30 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
21d40 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
21d50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21d60 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
21d70 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
21d80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21d90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
21da0 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
21db0 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
21dc0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
21dd0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
21de0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
21df0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
21e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21e10 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
21e20 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
21e30 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
21e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
21e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21e60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21e70 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
21e80 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
21e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21ea0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21ec0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
21ed0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
21ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
21ef0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
21f00 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
21f10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21f20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21f30 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
21f40 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
21f50 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
21f60 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
21f70 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
21f80 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
21f90 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
21fa0 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
21fb0 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
21fc0 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
21fd0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
21fe0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
21ff0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
22000 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
22010 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
22020 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
22030 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
22040 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
22050 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
22060 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22070 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
22080 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
22090 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
220a0 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
220b0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
220c0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
220d0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
220e0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
220f0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
22100 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
22110 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
22120 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
22130 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
22140 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
22150 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
22160 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
22170 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
22180 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
22190 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
221a0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
221b0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
221c0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
221d0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
221e0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
221f0 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
22200 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
22210 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
22220 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
22230 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
22240 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
22250 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
22260 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22290 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
222a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
222b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
222c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
222d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
222e0 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
222f0 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
22300 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
22310 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
22320 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
22330 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
22340 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
22350 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
22360 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
22370 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
22380 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
22390 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
223a0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
223b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
223c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
223d0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
223e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
223f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22400 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
22410 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
22420 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
22430 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
22440 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
22450 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
22460 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
22470 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
22480 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
22490 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
224a0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
224b0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
224c0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
224d0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
224e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
224f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
22500 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
22510 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
22520 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
22530 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
22540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22560 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
22570 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
22580 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
22590 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
225a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
225b0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
225c0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
225d0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
225e0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
225f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
22600 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
22610 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
22620 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
22630 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
22640 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
22650 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
22660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22670 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
22680 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
22690 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
226a0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
226b0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
226c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
226d0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
226e0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
226f0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
22700 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
22710 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
22720 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
22730 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
22740 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
22750 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
22760 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
22770 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
22780 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
22790 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
227a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
227b0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
227c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
227d0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
227e0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
227f0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
22800 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22810 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
22820 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
22830 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
22840 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
22850 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
22860 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
22870 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
22880 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22890 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
228a0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
228b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
228c0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
228d0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
228f0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
22900 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
22910 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
22940 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
22950 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
22980 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
22990 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
229a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
229b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
229c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
229d0 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
229e0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
229f0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
22a00 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
22a10 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
22a20 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
22a30 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
22a40 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
22a50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
22a60 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
22a70 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
22a80 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
22a90 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
22aa0 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
22ab0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
22ac0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
22ad0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
22ae0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
22af0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
22b00 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
22b10 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
22b20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
22b30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
22b40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
22b50 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66  , nFree+1);..#if
22b60 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
22b70 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66  E_DELETE.  /* If
22b80 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55   the SQLITE_SECU
22b90 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c  RE_DELETE compil
22ba0 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22bb0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
22bc0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
22bd0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
22be0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
22bf0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a  ith zeros..  */.
22c00 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
22c10 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
22c20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
22c30 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
22c40 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20  ))).   ||       
22c50 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74       (rc = sqlit
22c60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
22c70 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
22c80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
22c90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
22ca0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
22cb0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
22cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
22cd0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
22ce0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
22cf0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
22d00 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
22d10 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
22d20 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
22d30 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
22d40 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
22d50 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
22d60 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
22d70 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
22d80 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
22d90 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
22da0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
22db0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
22dc0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
22dd0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
22de0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
22df0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
22e00 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
22e10 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
22e20 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
22e30 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
22e40 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
22e50 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
22e60 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
22e70 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
22e80 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
22e90 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
22ea0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
22eb0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
22ec0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
22ed0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
22ee0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
22ef0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
22f00 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
22f10 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
22f20 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
22f30 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
22f40 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
22f50 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
22f60 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
22f70 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ree!=0 ){.    in
22f80 74 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  t nLeaf;        
22f90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
22fa0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
22fb0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
22fc0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
22fd0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
22fe0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
22ff0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  2]);.    rc = sq
23000 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23010 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
23020 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
23030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23040 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
23050 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
23060 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
23070 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
23080 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
23090 20 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b    if( nLeaf<0 ){
230a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
230b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
230c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
230d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
230e0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42      if( nLeaf<pB
230f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
23100 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
23110 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
23120 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
23130 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
23140 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
23150 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
23160 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
23170 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
23180 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
23190 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
231a0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
231b0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
231c0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
231d0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
231e0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
231f0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
23200 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
23210 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
23220 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
23230 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
23240 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
23250 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
23260 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
23270 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
23280 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
23290 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
232a0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
232b0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
232c0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
232d0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
232e0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
232f0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
23300 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
23310 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
23320 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
23330 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
23340 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20  will contain to 
23350 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
23360 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
23370 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
23380 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
23390 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
233a0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
233b0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
233c0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
233d0 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
233e0 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
233f0 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
23400 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
23410 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
23420 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
23430 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
23440 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
23450 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
23460 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
23470 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
23480 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
23490 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
234a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
234b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
234c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
234d0 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
234e0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
234f0 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
23500 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69  f*4], iPage);.#i
23510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  fndef SQLITE_SEC
23520 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  URE_DELETE.     
23530 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a     if( pPage ){.
23540 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23550 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
23560 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
23570 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
23580 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  f.        rc = b
23590 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
235a0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
235b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
235c0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
235d0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
235e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
235f0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
23600 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
23610 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
23620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23630 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
23640 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
23650 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
23660 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
23670 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
23680 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
23690 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
236a0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
236b0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
236c0 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
236d0 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
236e0 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
236f0 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
23700 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
23710 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
23720 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
23730 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
23740 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
23750 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
23760 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
23770 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
23780 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
23790 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28  ..  */.  if(   (
237a0 28 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21  (!pPage) && (0 !
237b0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  = (rc = sqlite3B
237c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
237d0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
237e0 30 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30  0)))).     || (0
237f0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
23800 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
23810 65 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20  e->pDbPage))).  
23820 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
23830 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
23840 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
23850 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
23860 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
23870 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
23880 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
23890 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
238a0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
238b0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
238c0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
238d0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
238e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
238f0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
23900 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
23910 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
23920 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
23930 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
23940 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
23950 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
23960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
23970 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28  ic int freePage(
23980 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
23990 0a 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61  .  return freePa
239a0 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
239b0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
239c0 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  no);.}../*.** Fr
239d0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
239e0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
239f0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
23a00 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
23a10 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
23a20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
23a30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
23a40 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
23a50 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
23a60 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
23a70 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
23a80 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
23a90 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31   int nOvfl;.  u1
23aa0 36 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  6 ovflPageSize;.
23ab0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23ac0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23ad0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23ae0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
23af0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
23b00 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
23b10 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
23b20 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
23b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23b40 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
23b50 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
23b60 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
23b70 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
23b80 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
23b90 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
23ba0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
23bb0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
23bc0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
23bd0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
23be0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
23bf0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
23c00 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
23c10 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
23c20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
23c30 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
23c40 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
23c50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
23c60 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
23c70 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
23c80 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
23c90 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
23ca0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
23cb0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c  lPgno==0 || ovfl
23cc0 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  Pgno>pagerPageco
23cd0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
23ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23cf0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23d00 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
23d10 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
23d20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
23d30 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
23d40 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
23d50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
23d60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23d70 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
23d80 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
23d90 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66  vflPgno);.    if
23da0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
23db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23dc0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
23dd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
23de0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
23df0 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
23e00 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
23e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23e20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
23e30 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
23e40 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
23e50 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
23e60 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
23e70 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
23e80 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
23e90 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
23ea0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
23eb0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
23ec0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
23ed0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
23ee0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
23ef0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
23f00 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
23f10 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
23f20 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
23f30 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
23f40 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
23f50 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
23f60 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
23f70 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
23f80 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
23f90 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
23fa0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
23fb0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
23fc0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
23fd0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
23fe0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
23ff0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
24000 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
24010 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
24020 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24030 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
24040 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24060 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
24070 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
24080 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
24090 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
240a0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
240b0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
240c0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
240d0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
240e0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
240f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
24100 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
24110 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
24120 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
24150 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
24160 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
24170 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
241a0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
241b0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
241c0 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
241d0 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
241e0 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
241f0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
24200 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
24210 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
24220 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
24230 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
24240 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
24250 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
24260 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
24270 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
24280 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
24290 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
242a0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
242b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
242c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
242d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
242e0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
242f0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
24300 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
24310 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
24320 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
24330 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
24340 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
24350 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
24360 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
24370 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
24380 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
24390 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
243a0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
243b0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
243c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
243d0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
243e0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
243f0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
24400 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
24410 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
24420 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
24430 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
24440 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
24450 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
24460 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
24470 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
24480 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
24490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
244a0 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
244b0 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
244c0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
244d0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
244e0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  *)&nKey);.  sqli
244f0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
24500 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
24510 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
24520 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
24530 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
24540 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
24550 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
24560 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
24570 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
24580 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
24590 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
245a0 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
245b0 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
245c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
245d0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
245e0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
245f0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
24600 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
24610 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b  lse{ .    if( nK
24620 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
24630 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20   pKey==0 ){.    
24640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24650 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
24660 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28     nPayload += (
24670 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53  int)nKey;.    pS
24680 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e  rc = pKey;.    n
24690 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  Src = (int)nKey;
246a0 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  .  }.  *pnSize =
246b0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73   info.nSize;.  s
246c0 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e  paceLeft = info.
246d0 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f  nLocal;.  pPaylo
246e0 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
246f0 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d  der];.  pPrior =
24700 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76   &pCell[info.iOv
24710 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c  erflow];..  whil
24720 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b  e( nPayload>0 ){
24730 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
24740 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  ft==0 ){.#ifndef
24750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24760 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
24770 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
24780 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
24790 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
247a0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
247b0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
247c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
247d0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
247e0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
247f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
24800 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
24810 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
24820 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
24830 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
24840 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24850 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
24860 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24870 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
24880 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
24890 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c  Ovfl, &pgnoOvfl,
248a0 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23   pgnoOvfl, 0);.#
248b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
248c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
248d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
248e0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
248f0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
24900 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
24910 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
24920 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
24930 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
24940 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
24950 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
24960 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
24970 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
24980 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
24990 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
249a0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
249b0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
249c0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
249d0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
249e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
249f0 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
24a00 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
24a10 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
24a20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
24a30 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
24a40 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
24a50 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
24a60 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
24a70 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
24a80 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
24a90 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
24aa0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
24ab0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
24ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
24ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
24ae0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
24af0 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
24b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
24b10 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
24b20 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
24b30 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
24b40 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
24b50 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
24b60 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
24b70 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
24b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
24b90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
24ba0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
24bb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24bc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
24bd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24be0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
24bf0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
24c00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24c10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
24c20 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
24c30 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
24c40 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69   pPrior points i
24c50 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
24c60 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54  a.      ** of pT
24c70 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
24c80 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
24c90 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
24ca0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  le. */.      ass
24cb0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
24cc0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
24cd0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
24ce0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
24cf0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e) );..      /* 
24d00 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72  If pPrior is par
24d10 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
24d20 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
24d30 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
24d40 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  e.      ** is st
24d50 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
24d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24d70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61  Prior<pPage->aDa
24d80 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70  ta || pPrior>=&p
24d90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
24da0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
24db0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
24dc0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24dd0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
24de0 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34  ) );..      put4
24df0 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e  byte(pPrior, pgn
24e00 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65  oOvfl);.      re
24e10 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
24e20 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f  ease);.      pTo
24e30 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b  Release = pOvfl;
24e40 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
24e50 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20  pOvfl->aData;.  
24e60 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
24e70 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ior, 0);.      p
24e80 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c  Payload = &pOvfl
24e90 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20  ->aData[4];.    
24ea0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42    spaceLeft = pB
24eb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
24ec0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d  4;.    }.    n =
24ed0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69   nPayload;.    i
24ee0 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29  f( n>spaceLeft )
24ef0 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a   n = spaceLeft;.
24f00 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65  .    /* If pToRe
24f10 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
24f20 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20  o than pPayload 
24f30 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
24f40 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a  data area.    **
24f50 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
24f60 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
24f70 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
24f80 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
24f90 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
24fa0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
24fb0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24fc0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
24fd0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f  bPage) );..    /
24fe0 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73  * If pPayload is
24ff0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
25000 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
25010 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
25020 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20  pPage.    ** is 
25030 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
25040 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
25050 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61  Payload<pPage->a
25060 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64  Data || pPayload
25070 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
25080 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
25090 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
250a0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
250b0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
250c0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66  Page) );..    if
250d0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
250e0 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e    if( n>nSrc ) n
250f0 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61   = nSrc;.      a
25100 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20  ssert( pSrc );. 
25110 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
25120 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
25130 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25140 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
25150 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
25160 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
25170 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
25180 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
25190 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
251a0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
251b0 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
251c0 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
251d0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
251e0 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
251f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25200 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
25210 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  ease);.  return 
25220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25230 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69  .** Remove the i
25240 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  -th cell from pP
25250 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  age.  This routi
25260 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65  ne effects pPage
25270 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65   only..** The ce
25280 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ll content is no
25290 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c  t freed or deall
252a0 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61  ocated.  It is a
252b0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
252c0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
252d0 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20  has been copied 
252e0 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20  someplace else. 
252f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
25300 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68  st.** removes th
25310 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
25320 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  he cell from pPa
25330 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d  ge..**.** "sz" m
25340 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65  ust be the numbe
25350 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
25360 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  e cell..*/.stati
25370 63 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d  c int dropCell(M
25380 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
25390 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b  nt idx, int sz){
253a0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
253b0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
253c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
253d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
253e0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
253f0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
25400 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
25410 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
25420 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
25430 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
25440 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
25450 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
25460 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
25470 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
25480 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
25490 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
254a0 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
254b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
254c0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
254d0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
254e0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
254f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25500 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
25510 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
25520 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25530 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
25540 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
25550 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
25560 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64  Data;.  ptr = &d
25570 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ata[pPage->cellO
25580 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a  ffset + 2*idx];.
25590 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
255a0 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c  ptr);.  if( (pc<
255b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
255c0 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f  +6+(pPage->leaf?
255d0 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70  0:4)).     || (p
255e0 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d  c+sz>pPage->pBt-
255f0 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a  >usableSize) ){.
25600 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25610 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25620 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
25630 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
25640 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sz);.  if( rc!=S
25650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25660 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25670 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c   for(i=idx+1; i<
25680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
25690 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20  +, ptr+=2){.    
256a0 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b  ptr[0] = ptr[2];
256b0 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74  .    ptr[1] = pt
256c0 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  r[3];.  }.  pPag
256d0 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
256e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
256f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
25700 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
25710 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
25720 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53  += 2;.  return S
25730 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
25740 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
25750 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
25760 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
25770 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
25780 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
25790 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
257a0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
257b0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
257c0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
257d0 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
257e0 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
257f0 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
25800 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
25810 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
25820 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
25830 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
25840 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
25850 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
25860 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
25870 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
25880 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
25890 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
258a0 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
258b0 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
258c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
258d0 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
258e0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
258f0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
25900 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
25910 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
25920 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
25930 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
25940 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
25950 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
25960 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
25970 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
25980 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
25990 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
259a0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
259b0 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
259c0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
259d0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
259e0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
259f0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
25a00 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
25a10 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
25a20 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
25a30 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
25a40 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
25a50 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
25a60 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
25a70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
25a80 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
25a90 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
25aa0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
25ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
25ac0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
25ad0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
25ae0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
25af0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
25b00 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
25b10 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
25b20 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
25b30 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
25b40 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
25b50 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
25b60 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
25b70 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
25b80 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
25b90 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20  */.  u8 nSkip   
25ba0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
25bb0 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73 74   write the first
25bc0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
25bd0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
25be0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
25bf0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
25c00 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
25c10 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
25c20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
25c30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
25c40 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
25c50 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  top;          /*
25c60 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
25c70 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  ontent for any c
25c80 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ell in data[] */
25c90 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
25ca0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
25cb0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
25cc0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
25cd0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
25ce0 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
25cf0 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
25d00 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
25d10 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
25d20 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rted */.  int hd
25d30 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
25d40 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b  ffset into data[
25d50 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 65  ] of the page he
25d60 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
25d70 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
25d80 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
25d90 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
25da0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
25db0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
25dc0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
25dd0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
25de0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
25df0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
25e00 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
25e10 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
25e20 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65  ata[] */..  asse
25e30 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
25e40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
25e50 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
25e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25e70 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
25e80 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
25e90 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
25ea0 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
25eb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
25ec0 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a  erflow<=ArraySiz
25ed0 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20  e(pPage->aOvfl) 
25ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
25ef0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
25f00 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  ge, pCell) );.  
25f10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25f20 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
25f30 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
25f40 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
25f50 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
25f60 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
25f70 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
25f80 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
25f90 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c  emp+nSkip, pCell
25fa0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
25fb0 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
25fc0 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
25fd0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
25fe0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
25ff0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
26000 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
26010 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
26020 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  >aOvfl[0])) );. 
26030 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
26040 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  j].pCell = pCell
26050 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
26060 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36  fl[j].idx = (u16
26070 29 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  )i;.    pPage->n
26080 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Free = 0;.  }els
26090 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
260a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
260b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
260c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
260d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
260e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
260f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
26100 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26110 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
26120 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
26130 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
26140 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61  a;.    hdr = pPa
26150 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
26160 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
26170 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
26180 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  .    cellOffset 
26190 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
261a0 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63  set;.    end = c
261b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
261c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a  age->nCell + 2;.
261d0 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
261e0 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
261f0 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20  if( end > top - 
26200 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  sz ){.      rc =
26210 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
26220 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  pPage);.      if
26230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26240 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
26250 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
26260 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
26270 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
26280 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26290 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20  end + sz <= top 
262a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
262b0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
262c0 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20  (pPage, sz);.   
262d0 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20 29   assert( idx>0 )
262e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 6e  ;.    assert( en
262f0 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26 64  d <= get2byte(&d
26300 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
26310 20 20 20 69 66 20 28 69 64 78 2b 73 7a 20 3e 20     if (idx+sz > 
26320 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
26330 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20 20 20 20  leSize) {.      
26340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26350 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
26360 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  }.    pPage->nCe
26370 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
26380 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20  >nFree -= 2;.   
26390 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
263a0 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
263b0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
263c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d  ;.    for(j=end-
263d0 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b  2, ptr=&data[j];
263e0 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74   j>ins; j-=2, pt
263f0 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72  r-=2){.      ptr
26400 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20  [0] = ptr[-2];. 
26410 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74       ptr[1] = pt
26420 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  r[-1];.    }.   
26430 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
26440 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
26450 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
26460 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
26470 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
26480 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26490 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
264a0 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
264b0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
264c0 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
264d0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
264e0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
264f0 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
26500 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
26510 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
26520 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
26530 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
26540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43        */.      C
26550 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
26560 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
26570 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
26580 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
26590 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
265a0 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
265b0 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
265c0 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e  fo.nKey))==info.
265d0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
265e0 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74    if( (info.nDat
265f0 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
26600 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69  ?0:info.nKey))>i
26610 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
26620 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f        Pgno pgnoO
26630 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
26640 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
26650 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
26660 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
26670 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f  Page->pBt, pgnoO
26680 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
26690 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
266a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
266b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
266c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
266d0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
266e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
266f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26700 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
26710 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
26720 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
26730 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
26740 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
26750 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
26760 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
26770 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
26780 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
26790 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
267a0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
267b0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
267c0 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
267d0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
267e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
267f0 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
26800 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
26810 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
26820 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
26830 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
26840 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
26850 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
26860 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
26870 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
26880 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
26890 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69  */.  int totalSi
268a0 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  ze;    /* Total 
268b0 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
268c0 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  s */.  int hdr; 
268d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
268e0 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  x of page header
268f0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74   */.  int cellpt
26900 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65  r;      /* Addre
26910 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
26920 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  pointer */.  int
26930 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f   cellbody;     /
26940 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
26950 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20  t cell body */. 
26960 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
26970 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
26980 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  he page */..  as
26990 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
269a0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
269b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
269c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
269d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
269e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
269f0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
26a00 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
26a10 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
26a20 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b  e->pBt)<=5460 );
26a30 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30  .  totalSize = 0
26a40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
26a50 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
26a60 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69  totalSize += aSi
26a70 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ze[i];.  }.  ass
26a80 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32  ert( totalSize+2
26a90 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e  *nCell<=pPage->n
26aa0 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Free );.  assert
26ab0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
26ac0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
26ad0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
26ae0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
26af0 62 50 61 67 65 29 20 29 3b 0a 20 20 63 65 6c 6c  bPage) );.  cell
26b00 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  ptr = pPage->cel
26b10 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  lOffset;.  data 
26b20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
26b30 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
26b40 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74 32  drOffset;.  put2
26b50 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
26b60 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28  ], nCell);.  if(
26b70 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65   nCell ){.    ce
26b80 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74  llbody = allocat
26b90 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74 6f  eSpace(pPage, to
26ba0 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61 73  talSize);.    as
26bb0 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30  sert( cellbody>0
26bc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26bd0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20  pPage->nFree >= 
26be0 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  2*nCell );.    p
26bf0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
26c00 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28  *nCell;.    for(
26c10 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
26c20 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62 79  +){.      put2by
26c30 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74 72  te(&data[cellptr
26c40 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
26c50 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
26c60 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
26c70 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29  ll[i], aSize[i])
26c80 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72 20  ;.      cellptr 
26c90 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c  += 2;.      cell
26ca0 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d  body += aSize[i]
26cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
26cc0 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50  rt( cellbody==pP
26cd0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
26ce0 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50  Size );.  }.  pP
26cf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
26d00 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
26d10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
26d20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
26d30 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
26d40 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
26d50 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
26d60 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
26d70 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
26d80 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
26d90 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
26da0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
26db0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
26dc0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
26dd0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
26de0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
26df0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
26e00 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
26e10 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
26e20 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
26e30 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
26e40 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
26e50 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
26e60 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
26e70 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
26e80 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
26e90 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
26ea0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
26eb0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
26ec0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
26ed0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
26ee0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
26ef0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
26f00 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
26f10 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
26f20 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
26f30 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
26f40 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
26f50 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
26f60 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
26f70 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
26f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26f90 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
26fa0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
26fb0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
26fc0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
26fd0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
26fe0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
26ff0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
27000 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
27010 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
27020 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
27030 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66  sor*, int);..#if
27040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27050 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
27060 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
27070 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
27080 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
27090 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
270a0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
270b0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
270c0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
270d0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
270e0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
270f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
27100 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
27110 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
27120 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
27130 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
27140 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
27150 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
27160 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
27170 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
27180 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
27190 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
271a0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
271b0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
271c0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
271d0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
271e0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
271f0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
27200 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
27210 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
27220 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
27230 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
27240 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
27250 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
27260 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
27270 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
27280 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
27290 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
272a0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
272b0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
272c0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
272d0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
272e0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
272f0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
27300 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
27310 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
27320 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
27330 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
27340 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
27350 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
27360 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27370 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 42   balance_quick(B
27380 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
27390 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
273a0 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  age *pNew = 0;. 
273b0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
273c0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31   u8 *pCell;.  u1
273d0 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  6 szCell;.  Cell
273e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 4d 65 6d  Info info;.  Mem
273f0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
27400 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27410 3e 69 50 61 67 65 5d 3b 0a 20 20 4d 65 6d 50 61  >iPage];.  MemPa
27420 67 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 43  ge *pParent = pC
27430 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27440 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 42 74 53  >iPage-1];.  BtS
27450 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
27460 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
27470 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
27480 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
27490 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
274a0 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
274b0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
274c0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
274d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
274e0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
274f0 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
27500 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
27510 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
27520 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
27530 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
27540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27550 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
27560 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
27570 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
27580 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
27590 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
275a0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
275b0 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
275c0 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
275d0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
275e0 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
275f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
27600 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
27610 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
27620 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
27630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
27640 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
27650 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
27660 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53    szCell = cellS
27670 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
27680 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ell);.    assert
27690 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
276a0 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e  writeable(pNew->
276b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
276c0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
276d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
276e0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
276f0 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
27700 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  l, &szCell);.   
27710 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
27720 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a  w = 0;.  .    /*
27730 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e   pPage is curren
27740 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68  tly the right-ch
27750 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20  ild of pParent. 
27760 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 20 20  Change this.    
27770 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
27780 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
27790 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
277a0 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
277b0 20 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74     ** pPage is t
277c0 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
277d0 20 63 68 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a   child. .    **.
277e0 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68      ** Ignore th
277f0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
27800 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 66 69  f the call to fi
27810 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c  llInCell(). fill
27820 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20  InCell().    ** 
27830 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20  may only return 
27840 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
27850 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20 72 65  E_OK if it is re
27860 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61  quired to alloca
27870 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72  te.    ** one or
27880 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
27890 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69  ages. Since an i
278a0 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d  nternal table B-
278b0 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a  Tree cell .    *
278c0 2a 20 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c  * may never spil
278d0 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f  l over onto an o
278e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74  verflow page (it
278f0 20 69 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66   is a maximum of
27900 20 0a 20 20 20 20 2a 2a 20 31 33 20 62 79 74 65   .    ** 13 byte
27910 73 20 69 6e 20 73 69 7a 65 29 2c 20 69 74 20 69  s in size), it i
27920 73 20 6e 6f 74 20 6e 65 63 63 65 73 73 61 72 79  s not neccessary
27930 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 72 65   to check the re
27940 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a  turn code..    *
27950 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72  *.    ** Similar
27960 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43 65  ly, the insertCe
27970 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ll() function ca
27980 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68 65  nnot fail if the
27990 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 62 65 69   page.    ** bei
279a0 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ng inserted into
279b0 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74   is already writ
279c0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c  able and the cel
279d0 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20  l does not .    
279e0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76  ** contain an ov
279f0 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20  erflow pointer. 
27a00 53 6f 20 69 67 6e 6f 72 65 20 74 68 69 73 20 72  So ignore this r
27a10 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a  eturn code too..
27a20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
27a30 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
27a40 30 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  0 );.    pCell =
27a50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
27a60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
27a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
27a80 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
27a90 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
27aa0 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43  fo);.    fillInC
27ab0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
27ac0 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  entCell, 0, info
27ad0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
27ae0 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  &parentSize);.  
27af0 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
27b00 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 20 20 61  Size<64 );.    a
27b10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
27b20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
27b30 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
27b40 20 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65   );.    insertCe
27b50 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
27b60 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c  ntIdx, parentCel
27b70 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30  l, parentSize, 0
27b80 2c 20 34 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 4);.    put4by
27b90 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
27ba0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
27bb0 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
27bc0 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 34 62 79  gno);.    put4by
27bd0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
27be0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
27bf0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
27c00 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  w);.  .    /* If
27c10 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
27c20 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
27c30 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
27c40 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
27c50 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
27c60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
27c70 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
27c80 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
27c90 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
27ca0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
27cb0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
27cc0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
27cd0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
27ce0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
27cf0 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
27d00 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
27d10 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
27d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
27d40 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
27d50 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
27d60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
27d70 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
27d80 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
27d90 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
27da0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
27db0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
27dc0 6f 69 6e 74 20 74 68 65 20 70 50 61 67 65 2d 3e  oint the pPage->
27dd0 6e 46 72 65 65 20 76 61 72 69 61 62 6c 65 20 69  nFree variable i
27de0 73 20 6e 6f 74 20 73 65 74 20 63 6f 72 72 65 63  s not set correc
27df0 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a 20 72 65  tly with.  ** re
27e00 73 70 65 63 74 20 74 6f 20 74 68 65 20 63 6f 6e  spect to the con
27e10 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
27e20 20 28 62 65 63 61 75 73 65 20 69 74 20 77 61 73   (because it was
27e30 20 73 65 74 20 74 6f 20 30 20 62 79 20 0a 20 20   set to 0 by .  
27e40 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20  ** insertCell). 
27e50 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  So call sqlite3B
27e60 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74  treeInitPage() t
27e70 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
27e80 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a  s.  ** correct..
27e90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68    **.  ** This h
27ea0 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 20 65 76  as to be done ev
27eb0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 77  en if an error w
27ec0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
27ed0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20   Normally, if.  
27ee0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
27ef0 72 73 20 64 75 72 69 6e 67 20 74 72 65 65 20 62  rs during tree b
27f00 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f  alancing, the co
27f10 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67  ntents of MemPag
27f20 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69  e are.  ** not i
27f30 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20 74 68 65  mportant, as the
27f40 79 20 77 69 6c 6c 20 62 65 20 72 65 63 61 6c 63  y will be recalc
27f50 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  ulated when the 
27f60 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20  page is rolled. 
27f70 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74 20 68 65   ** back. But he
27f80 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71  re, in balance_q
27f90 75 69 63 6b 28 29 2c 20 69 74 20 69 73 20 70 6f  uick(), it is po
27fa0 73 73 69 62 6c 65 20 74 68 61 74 20 70 50 61 67  ssible that pPag
27fb0 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  e has .  ** not 
27fc0 79 65 74 20 62 65 65 6e 20 6d 61 72 6b 65 64 20  yet been marked 
27fd0 64 69 72 74 79 20 6f 72 20 77 72 69 74 74 65 6e  dirty or written
27fe0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
27ff0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  l file. Therefor
28000 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e  e.  ** it will n
28010 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
28020 6b 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 69  k and so it is i
28030 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65  mportant to make
28040 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
28050 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 6e  the page data an
28060 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  d contents of Me
28070 6d 50 61 67 65 20 61 72 65 20 63 6f 6e 73 69 73  mPage are consis
28080 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  tent..  */.  pPa
28090 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
280a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
280b0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
280c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
280d0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
280e0 0a 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68  .  /* If everyth
280f0 69 6e 67 20 65 6c 73 65 20 73 75 63 63 65 65 64  ing else succeed
28100 65 64 2c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ed, balance the 
28110 70 61 72 65 6e 74 20 70 61 67 65 2c 20 69 6e 20  parent page, in 
28120 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 64  .  ** case the d
28130 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65  ivider cell inse
28140 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74  rted caused it t
28150 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
28160 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  l..  */.  if( rc
28170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28180 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
28190 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
281a0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63  >iPage--;.    rc
281b0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
281c0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
281d0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
281e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
281f0 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
28200 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28210 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
28220 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
28230 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
28240 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
28250 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
28260 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
28270 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
28280 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
28290 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
282a0 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
282b0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
282c0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
282d0 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
282e0 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
282f0 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
28300 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
28310 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
28320 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
28330 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
28340 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
28350 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
28360 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
28370 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
28380 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
28390 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
283a0 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
283b0 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
283c0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
283d0 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
283e0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
283f0 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
28400 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
28410 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
28420 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
28430 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
28440 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
28450 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
28460 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
28470 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
28480 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
28490 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
284a0 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
284b0 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
284c0 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
284d0 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
284e0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
284f0 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
28500 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
28510 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
28520 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
28530 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
28540 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
28550 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
28560 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
28570 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
28580 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
28590 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
285a0 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
285b0 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
285c0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
285d0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
285e0 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
285f0 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
28600 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
28610 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
28620 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
28630 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
28640 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
28650 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
28660 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
28670 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
28680 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
28690 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
286a0 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
286b0 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
286c0 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
286d0 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
286e0 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
286f0 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
28700 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
28710 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
28720 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
28730 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
28740 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
28750 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
28760 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
28770 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
28780 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
28790 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
287a0 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
287b0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
287c0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
287d0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
287e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
287f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
28800 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43  ance_nonroot(BtC
28810 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28820 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28840 54 68 65 20 6f 76 65 72 20 6f 72 20 75 6e 64 65  The over or unde
28850 72 66 75 6c 6c 20 70 61 67 65 20 74 6f 20 62 61  rfull page to ba
28860 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  lance */.  MemPa
28870 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ge *pParent;    
28880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28890 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a  arent of pPage *
288a0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
288b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
288c0 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
288d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
288e0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
288f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28900 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
28910 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
28920 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
28930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
28940 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
28950 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
28960 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
28970 4f 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Old = 0;        
28980 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28990 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
289a0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
289b0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
289c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
289d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
289e0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
289f0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
28a00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
28a10 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
28a20 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
28a30 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
28a40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
28a50 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
28a60 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
28a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28a80 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
28a90 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
28aa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
28ad0 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
28ae0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
28af0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28b10 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
28b20 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
28b30 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
28b40 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
28b50 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
28b60 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
28b70 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
28b80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
28b90 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
28ba0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
28bb0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
28bc0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
28bd0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
28be0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
28bf0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
28c00 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c20 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
28c30 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
28c40 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
28c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28c60 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
28c70 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
28c80 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
28c90 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
28ca0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
28cb0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
28cc0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
28cd0 6e 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20  nt iSpace2 = 0; 
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28cf0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
28d00 20 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f   of aSpace2[] */
28d10 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
28d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28d30 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
28d40 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
28d50 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
28d60 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
28d70 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
28d80 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
28d90 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
28da0 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
28db0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
28dc0 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
28dd0 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
28de0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
28df0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
28e00 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
28e10 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
28e20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
28e30 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
28e40 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
28e50 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
28e60 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
28e70 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
28e80 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
28e90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
28ea0 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
28eb0 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
28ec0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
28ed0 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
28ee0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
28ef0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
28f00 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
28f10 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
28f20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
28f30 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
28f40 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
28f50 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
28f60 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
28f70 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
28f80 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
28f90 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
28fa0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
28fb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
28fc0 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
28fd0 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
28fe0 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29000 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
29010 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
29020 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
29030 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
29040 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c  /* Space for hol
29050 64 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43  ding data of apC
29060 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  opy[] */.  u8 *a
29070 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20  Space1;         
29080 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
29090 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
290a0 73 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62  s cells before b
290b0 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a  alance */.  u8 *
290c0 61 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20  aSpace2 = 0;    
290d0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
290e0 6f 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72  overflow divider
290f0 73 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61  s cells after ba
29100 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61  lance */.  u8 *a
29110 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61  From = 0;..  pPa
29120 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29130 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
29140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29160 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29170 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 70  );.  VVA_ONLY( p
29180 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c  Cur->pagesShuffl
29190 65 64 20 3d 20 31 20 29 3b 0a 0a 20 20 2f 2a 20  ed = 1 );..  /* 
291a0 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70  .  ** Find the p
291b0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f  arent page..  */
291c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
291d0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
291e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
291f0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
29200 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
29210 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
29220 70 44 62 50 61 67 65 29 20 7c 7c 20 70 50 61 67  pDbPage) || pPag
29230 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
29240 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
29250 2d 3e 70 42 74 3b 0a 20 20 70 50 61 72 65 6e 74  ->pBt;.  pParent
29260 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29270 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
29280 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
29290 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  t );.  if( SQLIT
292a0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
292b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
292c0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29  arent->pDbPage))
292d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c   ){.    goto bal
292e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
292f0 7d 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  }..  TRACE(("BAL
29300 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
29310 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
29320 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
29330 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
29340 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29350 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
29360 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20  NCE.  /*.  ** A 
29370 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49  special case:  I
29380 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61  f a new entry ha
29390 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65  s just been inse
293a0 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  rted into a.  **
293b0 20 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c   table (that is,
293c0 20 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e   a btree with in
293d0 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61  teger keys and a
293e0 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c  ll data at the l
293f0 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20  eaves).  ** and 
29400 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73  the new entry is
29410 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29420 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
29430 65 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20  e (it has the.  
29440 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20  ** largest key) 
29450 74 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65  then use the spe
29460 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  cial balance_qui
29470 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
29480 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e  .  ** balancing.
29490 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
294a0 29 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72  ) is much faster
294b0 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20   and results in 
294c0 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70  a tighter.  ** p
294d0 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69  acking of data i
294e0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
294f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
29500 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20  age->leaf &&.   
29510 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
29520 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
29530 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26  >nOverflow==1 &&
29540 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  .      pPage->aO
29550 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
29560 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20  e->nCell &&.    
29570 20 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21    pParent->pgno!
29580 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34  =1 &&.      get4
29590 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
295a0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
295b0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61  rOffset+8])==pPa
295c0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20  ge->pgno.  ){.  
295d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
295e0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f  >intKey );.    /
295f0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
29600 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
29610 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
29620 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
29630 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
29640 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
29650 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
29660 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
29670 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
29680 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 43 75  alance_quick(pCu
29690 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  r);.  }.#endif..
296a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
296b0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
296c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
296d0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
296e0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
296f0 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eanup;.  }..  /*
29700 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  .  ** Find the c
29710 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e  ell in the paren
29720 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66  t page whose lef
29730 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62  t child points b
29740 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67  ack.  ** to pPag
29750 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61  e.  The "idx" va
29760 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e  riable is the in
29770 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c  dex of that cell
29780 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a  .  If pPage.  **
29790 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73   is the rightmos
297a0 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
297b0 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20  nt then set idx 
297c0 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  to pParent->nCel
297d0 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20  l .  */.  idx = 
297e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
297f0 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 61 73  ->iPage-1];.  as
29800 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
29810 70 50 61 72 65 6e 74 2c 20 69 64 78 2c 20 70 50  pParent, idx, pP
29820 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  age->pgno);..  /
29830 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c  *.  ** Find sibl
29840 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61  ing pages to pPa
29850 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73  ge and the cells
29860 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74   in pParent that
29870 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65   divide.  ** the
29880 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61   siblings.  An a
29890 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
298a0 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
298b0 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a  gs on either.  *
298c0 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  * side of pPage.
298d0 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20    More siblings 
298e0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
298f0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
29900 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20  , if.  ** pPage 
29910 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
29920 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
29930 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
29940 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a  de.  If pParent.
29950 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
29960 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
29970 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
29980 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
29990 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44  aken..  */.  nxD
299a0 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20  iv = idx - NN;. 
299b0 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20   if( nxDiv + NB 
299c0 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  > pParent->nCell
299d0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
299e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d  pParent->nCell -
299f0 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69   NB + 1;.  }.  i
29a00 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20  f( nxDiv<0 ){.  
29a10 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
29a20 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66  .  nDiv = 0;.  f
29a30 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b  or(i=0, k=nxDiv;
29a40 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29   i<NB; i++, k++)
29a50 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72  {.    if( k<pPar
29a60 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
29a70 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
29a80 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
29a90 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b   k);.      nDiv+
29aa0 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  +;.      assert(
29ab0 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20   !pParent->leaf 
29ac0 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  );.      pgnoOld
29ad0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61  [i] = get4byte(a
29ae0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65  pDiv[i]);.    }e
29af0 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65  lse if( k==pPare
29b00 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
29b10 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
29b20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
29b30 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
29b40 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
29b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29b60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
29b70 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
29b80 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
29b90 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69  Old[i], &apOld[i
29ba0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
29bb0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29bc0 65 61 6e 75 70 3b 0a 20 20 20 20 2f 2a 20 61 70  eanup;.    /* ap
29bd0 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e  Old[i]->idxParen
29be0 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20 20 20 61 70  t = k; */.    ap
29bf0 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Copy[i] = 0;.   
29c00 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c 64   assert( i==nOld
29c10 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b 0a   );.    nOld++;.
29c20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d      nMaxCells +=
29c30 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65   1+apOld[i]->nCe
29c40 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76  ll+apOld[i]->nOv
29c50 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  erflow;.  }..  /
29c60 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
29c70 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
29c80 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
29c90 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
29ca0 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
29cb0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
29cc0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
29cd0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
29ce0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
29cf0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
29d00 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74 63  .  */.  szScratc
29d10 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
29d20 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
29d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d40 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
29d50 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
29d60 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
29d90 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55 4e   */.     + (ROUN
29da0 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
29db0 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69 7a  e))+pBt->pageSiz
29dc0 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79 20  e)*NB  /* aCopy 
29dd0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
29de0 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
29e10 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41 55   */.     + (ISAU
29e20 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78 43  TOVACUUM ? nMaxC
29e30 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20 20  ells : 0);      
29e40 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d 20         /* aFrom 
29e50 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
29e60 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
29e70 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
29e80 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
29e90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
29ea0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
29eb0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
29ec0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
29ed0 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
29ee0 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
29ef0 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a   aCopy[0] = (u8*
29f00 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
29f10 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ls];.  assert( (
29f20 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a  (aCopy[0] - (u8*
29f30 29 30 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  )0) & 7)==0 ); /
29f40 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
29f50 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
29f60 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
29f70 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
29f80 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
29f90 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
29fa0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
29fb0 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
29fc0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
29fd0 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d  - (u8*)0) & 7)==
29fe0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
29ff0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
2a000 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63  d */.  }.  aSpac
2a010 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31  e1 = &aCopy[NB-1
2a020 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b  ][pBt->pageSize+
2a030 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
2a040 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65  mPage))];.  asse
2a050 72 74 28 20 28 28 61 53 70 61 63 65 31 20 2d 20  rt( ((aSpace1 - 
2a060 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20  (u8*)0) & 7)==0 
2a070 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
2a080 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
2a090 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
2a0a0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72  ACUUM ){.    aFr
2a0b0 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
2a0c0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
2a0d0 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71  }.  aSpace2 = sq
2a0e0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
2a0f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2a100 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30    if( aSpace2==0
2a110 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2a120 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
2a130 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2a140 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  nup;.  }.  .  /*
2a150 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
2a160 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
2a170 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
2a180 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
2a190 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
2a1a0 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
2a1b0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
2a1c0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
2a1d0 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
2a1e0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
2a1f0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
2a200 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
2a210 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
2a220 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
2a230 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2a240 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
2a250 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2a260 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
2a270 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
2a280 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69  MemPage*)aCopy[i
2a290 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ];.    memcpy(p,
2a2a0 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
2a2b0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
2a2c0 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69   p->aData = (voi
2a2d0 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  d*)&p[1];.    me
2a2e0 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
2a2f0 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
2a300 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2a310 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
2a320 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2a330 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2a340 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2a350 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2a360 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2a370 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2a380 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2a390 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2a3a0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2a3b0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2a3c0 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  form aSpace1[] a
2a3d0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2a3e0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2a3f0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2a400 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2a410 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2a420 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2a430 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2a440 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2a450 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2a460 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2a470 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2a480 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2a490 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2a4a0 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2a4b0 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2a4c0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2a4d0 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2a4e0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2a4f0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2a500 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2a510 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2a520 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2a530 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2a540 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2a550 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2a560 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2a570 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2a580 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2a590 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2a5a0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2a5b0 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2a5c0 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2a5d0 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2a5e0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2a5f0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2a600 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2a610 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
2a620 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
2a630 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
2a640 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
2a650 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a  pPage->hasData;.
2a660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2a670 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
2a680 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
2a690 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
2a6a0 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
2a6b0 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
2a6c0 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
2a6d0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
2a6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2a6f0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2a700 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2a710 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
2a720 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
2a730 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2a740 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
2a750 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
2a760 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
2a770 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2a780 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
2a790 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f   a;.        aFro
2a7a0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 28 75 38 29 69  m[nCell] = (u8)i
2a7b0 3b 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ;   assert( i>=0
2a7c0 20 26 26 20 69 3c 36 20 29 3b 0a 20 20 20 20 20   && i<6 );.     
2a7d0 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f     for(a=0; a<pO
2a7e0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61  ld->nOverflow; a
2a7f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2a800 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61  f( pOld->aOvfl[a
2a810 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b  ].pCell==apCell[
2a820 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20  nCell] ){.      
2a830 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
2a840 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
2a850 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a880 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
2a890 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
2a8a0 31 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  1 ){.      u16 s
2a8b0 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
2a8c0 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
2a8d0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  ]);.      if( le
2a8e0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
2a8f0 20 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45    /* With the LE
2a900 41 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61  AFDATA flag, pPa
2a910 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20  rent cells hold 
2a920 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61  only INTKEYs tha
2a930 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  t.        ** are
2a940 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b   duplicates of k
2a950 65 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64  eys on the child
2a960 20 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64   pages.  We need
2a970 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20   to remove.     
2a980 20 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65     ** the divide
2a990 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61  r cells from pPa
2a9a0 72 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69  rent, but the di
2a9b0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65  viders cells are
2a9c0 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
2a9d0 61 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b  added to apCell[
2a9e0 5d 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  ] because they a
2a9f0 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66  re duplicates of
2aa00 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20   child cells..  
2aa10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2aa20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
2aa30 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
2aa40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2aa50 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
2aa60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2aa70 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2aa80 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
2aa90 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
2aaa0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
2aab0 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
2aac0 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31  .        iSpace1
2aad0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
2aae0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
2aaf0 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20  >pageSize/4 );. 
2ab00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2ab10 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67  Space1<=pBt->pag
2ab20 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
2ab30 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61   memcpy(pTemp, a
2ab40 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  pDiv[i], sz);.  
2ab50 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
2ab60 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
2ab70 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2ab80 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2ab90 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
2aba0 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
2abb0 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d   0xFF;.        }
2abc0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
2abd0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2abe0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61  , sz);.        a
2abf0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2ac00 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
2ac10 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2ac20 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
2ac30 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75 31 36 29 6c  nCell] -= (u16)l
2ac40 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
2ac50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 67         assert( g
2ac60 65 74 34 62 79 74 65 28 70 54 65 6d 70 29 3d 3d  et4byte(pTemp)==
2ac70 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20  pgnoOld[i] );.  
2ac80 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
2ac90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2aca0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2acb0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
2acc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2acd0 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
2ace0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
2acf0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
2ad00 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 20  e left.         
2ad10 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
2ad20 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
2ad30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
2ad40 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
2ad50 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
2ad60 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  pOld->hdrOffset+
2ad70 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  8], 4);.        
2ad80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2ad90 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2ada0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
2adb0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
2adc0 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20  ll[nCell]<4 ){. 
2add0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2ade0 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
2adf0 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
2ae00 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
2ae10 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2ae20 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
2ae30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ae40 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c   }.        nCell
2ae50 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
2ae60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2ae70 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
2ae80 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ae90 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
2aea0 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
2aeb0 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
2aec0 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
2aed0 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
2aee0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
2aef0 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
2af00 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
2af10 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
2af20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
2af30 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
2af40 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
2af50 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
2af60 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
2af70 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
2af80 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
2af90 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
2afa0 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
2afb0 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
2afc0 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
2afd0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
2afe0 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
2aff0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
2b000 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
2b010 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
2b020 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
2b030 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
2b040 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
2b050 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
2b060 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
2b070 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
2b080 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
2b090 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
2b0a0 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
2b0b0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
2b0c0 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
2b0d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2b0e0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2b0f0 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
2b100 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
2b110 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
2b120 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
2b130 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
2b140 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
2b150 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
2b160 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
2b170 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
2b180 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
2b190 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
2b1a0 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
2b1b0 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
2b1c0 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
2b1d0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
2b1e0 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
2b1f0 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
2b200 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
2b210 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
2b220 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
2b230 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
2b240 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
2b250 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
2b260 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
2b270 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
2b280 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
2b290 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
2b2a0 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
2b2b0 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
2b2c0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
2b2d0 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
2b2e0 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
2b2f0 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
2b300 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
2b310 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
2b320 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2b330 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
2b340 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
2b350 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
2b360 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
2b370 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
2b380 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
2b390 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
2b3a0 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
2b3b0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
2b3c0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
2b3d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
2b3e0 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
2b3f0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
2b400 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
2b410 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
2b420 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
2b430 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
2b440 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
2b450 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
2b460 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
2b470 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
2b480 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
2b490 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
2b4a0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
2b4b0 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
2b4c0 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
2b4d0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
2b4e0 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
2b4f0 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
2b500 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
2b510 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
2b520 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b540 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
2b550 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
2b560 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
2b570 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
2b580 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2b590 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
2b5a0 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
2b5b0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
2b5c0 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
2b5d0 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
2b5e0 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2b5f0 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
2b600 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
2b610 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
2b620 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
2b630 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
2b640 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
2b650 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
2b660 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
2b670 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
2b680 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
2b690 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
2b6a0 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
2b6b0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
2b6c0 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
2b6d0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
2b6e0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
2b6f0 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
2b700 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
2b710 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
2b720 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
2b730 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
2b740 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
2b750 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
2b760 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65 20 61  w[0])>0) or we a
2b770 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20 76 69  re the.  ** a vi
2b780 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
2b790 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
2b7a0 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
2b7b0 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
2b7c0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
2b7d0 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
2b7e0 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
2b7f0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
2b800 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
2b810 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
2b820 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
2b830 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
2b840 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
2b850 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73  cate k new pages
2b860 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67  .  Reuse old pag
2b870 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c  es where possibl
2b880 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2b890 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
2b8a0 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d  );.  pageFlags =
2b8b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2b8c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
2b8d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
2b8e0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
2b8f0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
2b900 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
2b910 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
2b920 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
2b930 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20  = pgnoOld[i];.  
2b940 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2b950 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2b960 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b970 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
2b980 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2b990 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2b9a0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2b9b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b9c0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
2b9d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
2b9e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2b9f0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2ba00 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b  New[i], pgnoNew[
2ba10 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  i-1], 0);.      
2ba20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2ba30 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2ba40 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
2ba50 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
2ba60 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
2ba70 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
2ba80 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
2ba90 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
2baa0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
2bab0 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
2bac0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
2bad0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
2bae0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2baf0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2bb00 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
2bb10 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
2bb20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2bb30 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
2bb40 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
2bb50 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
2bb60 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
2bb70 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
2bb80 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
2bb90 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
2bba0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
2bbb0 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
2bbc0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
2bbd0 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
2bbe0 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
2bbf0 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
2bc00 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
2bc10 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
2bc20 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
2bc30 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
2bc40 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
2bc50 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
2bc60 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
2bc70 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
2bc80 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
2bc90 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
2bca0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
2bcb0 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
2bcc0 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
2bcd0 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
2bce0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
2bcf0 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
2bd00 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
2bd10 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
2bd20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
2bd30 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
2bd40 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
2bd50 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
2bd60 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
2bd70 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
2bd80 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b  nV = pgnoNew[i];
2bd90 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
2bda0 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
2bdb0 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
2bdc0 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a     if( pgnoNew[j
2bdd0 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56  ]<(unsigned)minV
2bde0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49   ){.        minI
2bdf0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69   = j;.        mi
2be00 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b  nV = pgnoNew[j];
2be10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2be20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
2be30 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
2be40 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
2be50 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e  .      t = pgnoN
2be60 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54 20  ew[i];.      pT 
2be70 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
2be80 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
2be90 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20  gnoNew[minI];.  
2bea0 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
2beb0 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
2bec0 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20    pgnoNew[minI] 
2bed0 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  = t;.      apNew
2bee0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
2bef0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
2bf00 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
2bf10 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25 64  d %d %d  new: %d
2bf20 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
2bf30 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
2bf40 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64  \n",.    pgnoOld
2bf50 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  [0], .    nOld>=
2bf60 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a  2 ? pgnoOld[1] :
2bf70 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
2bf80 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30  ? pgnoOld[2] : 0
2bf90 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d  ,.    pgnoNew[0]
2bfa0 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
2bfb0 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65  nNew>=2 ? pgnoNe
2bfc0 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[1] : 0, nNew>=
2bfd0 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30  2 ? szNew[1] : 0
2bfe0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20  ,.    nNew>=3 ? 
2bff0 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20  pgnoNew[2] : 0, 
2c000 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
2c010 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
2c020 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d  >=4 ? pgnoNew[3]
2c030 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
2c040 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
2c050 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f    nNew>=5 ? pgno
2c060 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[4] : 0, nNew
2c070 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
2c080 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   0));..  /*.  **
2c090 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
2c0a0 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
2c0b0 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
2c0c0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
2c0d0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
2c0e0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
2c0f0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
2c100 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
2c110 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
2c120 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
2c130 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
2c140 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
2c150 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2c160 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
2c170 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
2c180 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2c190 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 67  assert( pNew->pg
2c1a0 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29  no==pgnoNew[i] )
2c1b0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2c1c0 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
2c1d0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2c1e0 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
2c1f0 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
2c200 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
2c210 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2c220 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
2c230 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
2c240 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
2c250 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
2c260 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f  low==0 );..    /
2c270 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2c280 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
2c290 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
2c2a0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
2c2b0 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  ries.    ** that
2c2c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 69   point to the si
2c2d0 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
2c2e0 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68 65   rearranged. The
2c2f0 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a  se can be: left.
2c300 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20      ** children 
2c310 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72 69  of cells, the ri
2c320 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
2c330 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c   page, or overfl
2c340 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20  ow pages.    ** 
2c350 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63 65  pointed to by ce
2c360 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lls..    */.    
2c370 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c380 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   ){.      for(k=
2c390 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20  j; k<cntNew[i]; 
2c3a0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  k++){.        as
2c3b0 73 65 72 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c  sert( k<nMaxCell
2c3c0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
2c3d0 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20   aFrom[k]==0xFF 
2c3e0 7c 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b  || apCopy[aFrom[
2c3f0 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d  k]]->pgno!=pNew-
2c400 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  >pgno ){.       
2c410 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2c420 74 4f 76 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29  tOvfl(pNew, k-j)
2c430 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c450 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2c460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c470 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2c480 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
2c490 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41  pCell[k]), PTRMA
2c4a0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
2c4b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
2c4c0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2c4d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c4f0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2c500 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
2c510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c520 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20  .    }..    j = 
2c530 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20  cntNew[i];..    
2c540 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  /* If the siblin
2c550 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g page assembled
2c560 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74   above was not t
2c570 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  he right-most si
2c580 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e  bling,.    ** in
2c590 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63  sert a divider c
2c5a0 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72  ell into the par
2c5b0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2c5c0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d  .    if( i<nNew-
2c5d0 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a  1 && j<nCell ){.
2c5e0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
2c5f0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
2c600 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
2c610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
2c620 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2c630 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
2c640 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
2c650 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
2c660 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2c670 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2c680 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20  ace2[iSpace2];. 
2c690 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
2c6a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2c6b0 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
2c6c0 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
2c6d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
2c6e0 53 41 55 54 4f 56 41 43 55 55 4d 20 0a 20 20 20  SAUTOVACUUM .   
2c6f0 20 20 20 20 20 20 26 26 20 28 61 46 72 6f 6d 5b        && (aFrom[
2c700 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f  j]==0xFF || apCo
2c710 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67  py[aFrom[j]]->pg
2c720 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a  no!=pNew->pgno).
2c730 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2c740 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2c750 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
2c760 65 28 70 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50  e(pCell), PTRMAP
2c770 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
2c780 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  no);.          i
2c790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c7a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c7b0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2c7c0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20  anup;.          
2c7d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2c7e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
2c7f0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
2c800 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
2c810 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
2c820 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
2c830 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
2c840 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2c850 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
2c860 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
2c870 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
2c880 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
2c890 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
2c8a0 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
2c8b0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
2c8c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
2c8d0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
2c8e0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
2c8f0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
2c900 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
2c910 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
2c920 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2c930 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
2c940 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
2c950 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
2c960 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
2c970 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2c980 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
2c990 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
2c9a0 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
2c9b0 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
2c9c0 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
2c9d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c9e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c9f0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2ca00 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2ca10 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 65 6d    }.        pTem
2ca20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
2ca30 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
2ca40 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
2ca50 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
2ca60 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
2ca70 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
2ca80 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
2ca90 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
2caa0 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
2cab0 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
2cac0 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
2cad0 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
2cae0 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
2caf0 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
2cb00 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
2cb10 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
2cb20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42  ** (see sqlite3B
2cb30 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2cb40 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74  (), 4 bytes is t
2cb50 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
2cb60 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  of.        ** an
2cb70 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20  y cell). But it 
2cb80 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
2cb90 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74  pass the correct
2cba0 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20   size to .      
2cbb0 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28    ** insertCell(
2cbc0 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68  ), so reparse th
2cbd0 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20  e cell now..    
2cbe0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2cbf0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
2cc00 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65   can never happe
2cc10 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  n in an SQLite d
2cc20 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c  ata file, as all
2cc30 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
2cc40 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34  s are at least 4
2cc50 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20   bytes. It only 
2cc60 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65  happens in b-tre
2cc70 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20  es used.        
2cc80 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22  ** to evaluate "
2cc90 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
2cca0 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61   and similar cla
2ccb0 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  uses..        */
2ccc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2ccd0 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20  ell[j]==4 ){.   
2cce0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65         assert(le
2ccf0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29  afCorrection==4)
2cd00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d  ;.          sz =
2cd10 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2cd20 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  rent, pCell);.  
2cd30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2cd40 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b 3d        iSpace2 +=
2cd50 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
2cd60 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65  t( sz<=pBt->page
2cd70 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20  Size/4 );.      
2cd80 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32 3c  assert( iSpace2<
2cd90 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
2cda0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73  ;.      rc = ins
2cdb0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
2cdc0 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
2cdd0 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20  z, pTemp, 4);.  
2cde0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cdf0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
2ce00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2ce10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2ce20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2ce30 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2ce40 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 70  Page) );.      p
2ce50 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
2ce60 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
2ce70 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70  ,nxDiv), pNew->p
2ce80 67 6e 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  gno);..      /* 
2ce90 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2cea0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2ceb0 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
2cec0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
2ced0 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
2cee0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2cef0 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
2cf00 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2cf10 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
2cf20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
2cf30 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
2cf40 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
2cf50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2cf60 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2cf70 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
2cf80 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2cf90 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
2cfa0 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
2cfb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cfc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cfd0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2cfe0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2cff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2d000 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
2d010 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  v++;.    }..    
2d020 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  /* Set the point
2d030 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er-map entry for
2d040 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
2d050 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66   page. */.    if
2d060 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2d070 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2d080 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
2d090 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2d0a0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2d0b0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2d0c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d0d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61  .        goto ba
2d0e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2d0f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d100 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
2d110 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2d120 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
2d130 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
2d140 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
2d150 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
2d160 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
2d170 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
2d180 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
2d190 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
2d1a0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
2d1b0 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
2d1c0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2d1d0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  UUM ){.      rc 
2d1e0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
2d1f0 20 67 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64   get4byte(zChild
2d200 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
2d210 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
2d220 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
2d230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d240 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62  {.        goto b
2d250 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2d260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d270 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
2d280 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d290 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2d2a0 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 6e  Page) );.  if( n
2d2b0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  xDiv==pParent->n
2d2c0 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f  Cell+pParent->nO
2d2d0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f  verflow ){.    /
2d2e0 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
2d2f0 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68  ling is the righ
2d300 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20  t-most child of 
2d310 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70  pParent */.    p
2d320 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2d330 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2d340 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2d350 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2d360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
2d370 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
2d380 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20  ing is the left 
2d390 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72  child of the fir
2d3a0 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72  st entry in pPar
2d3b0 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  ent.    ** past 
2d3c0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64  the right-most d
2d3d0 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a  ivider entry */.
2d3e0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2d3f0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2d400 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70  arent, nxDiv), p
2d410 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b  gnoNew[nNew-1]);
2d420 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2d430 42 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  Balance the pare
2d440 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74  nt page.  Note t
2d450 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  hat the current 
2d460 70 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67  page (pPage) mig
2d470 68 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ht.  ** have bee
2d480 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  n added to the f
2d490 72 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69  reelist so it mi
2d4a0 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  ght no longer be
2d4b0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
2d4c0 2a 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e  ** But the paren
2d4d0 74 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61  t page will alwa
2d4e0 79 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ys be initialize
2d4f0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
2d500 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
2d510 74 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  t );.  sqlite3Sc
2d520 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2d530 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b  );.  apCell = 0;
2d540 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2d550 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74  CE: finished wit
2d560 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  h %d: old=%d new
2d570 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
2d580 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2d590 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e  ->pgno, nOld, nN
2d5a0 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 70  ew, nCell));.  p
2d5b0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2d5c0 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  = 0;.  releasePa
2d5d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75  ge(pPage);.  pCu
2d5e0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 72 63  r->iPage--;.  rc
2d5f0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c   = balance(pCur,
2d600 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a   0);.  .  /*.  *
2d610 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
2d620 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
2d630 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
2d640 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  :.  sqlite3PageF
2d650 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20  ree(aSpace2);.  
2d660 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
2d670 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
2d680 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2d690 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
2d6a0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2d6b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2d6c0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
2d6d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
2d6e0 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 43  ew[i]);.  }.  pC
2d6f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d700 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
2d710 6f 77 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  ow = 0;..  retur
2d720 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2d730 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2d740 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f  alled for the ro
2d750 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 74 72  ot page of a btr
2d760 65 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ee when the root
2d770 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  .** page contain
2d780 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69  s no cells.  Thi
2d790 73 20 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e  s is an opportun
2d7a0 69 74 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ity to make the 
2d7b0 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65  tree.** shallowe
2d7c0 72 20 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a  r by one level..
2d7d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2d7e0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2d7f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2d800 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d810 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2d820 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
2d830 42 2d 54 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50  B-Tree */.  MemP
2d840 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20  age *pChild;    
2d850 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d860 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20  only child page 
2d870 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67  of pPage */.  Pg
2d880 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20  no pgnoChild;   
2d890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2d8a0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43  ge number for pC
2d8b0 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  hild */.  int rc
2d8c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2d8d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d8e0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
2d8f0 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74  ocedures */.  Bt
2d900 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
2d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d920 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20   The main BTree 
2d930 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
2d940 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  nt mxCellPerPage
2d950 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
2d960 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2d970 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20   cells per page 
2d980 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2d990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d9a0 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66    /* All cells f
2d9b0 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20  rom pages being 
2d9c0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
2d9d0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
2d9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d9f0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
2da00 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65  cells */..  asse
2da10 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2da20 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
2da30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2da40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2da50 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2da60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2da70 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2da80 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2da90 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
2daa0 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50 65  >pBt;.  mxCellPe
2dab0 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c 28  rPage = MX_CELL(
2dac0 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20 3d  pBt);.  apCell =
2dad0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2dae0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28 73  mxCellPerPage*(s
2daf0 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65 6f  izeof(u8*)+sizeo
2db00 66 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66 28  f(u16)) );.  if(
2db10 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74   apCell==0 ) ret
2db20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2db30 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  ;.  szCell = (u1
2db40 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65 6c  6*)&apCell[mxCel
2db50 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66 28  lPerPage];.  if(
2db60 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2db70 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2db80 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
2db90 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41 43  mpty */.    TRAC
2dba0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d 70  E(("BALANCE: emp
2dbb0 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c 20  ty table %d\n", 
2dbc0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2dbd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
2dbe0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2dbf0 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f 6e  empty but has on
2dc00 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73 66  e child.  Transf
2dc10 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69 6e  er the.    ** in
2dc20 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
2dc30 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69 6e  hat one child in
2dc40 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
2dc50 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20 77   if it .    ** w
2dc60 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20 72  ill fit.  This r
2dc70 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74 68  educes the depth
2dc80 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79 20   of the tree by 
2dc90 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
2dca0 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20 70  ** If the root p
2dcb0 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20 69  age is page 1, i
2dcc0 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63 65  t has less space
2dcd0 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e 0a   available than.
2dce0 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c 64      ** its child
2dcf0 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30 30   (due to the 100
2dd00 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68 61   byte header tha
2dd10 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
2dd20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  beginning.    **
2dd30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2dd40 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69 67   fle), so it mig
2dd50 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ht not be able t
2dd60 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74 68  o hold all of th
2dd70 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  e .    ** inform
2dd80 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ation currently 
2dd90 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2dda0 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69 73   child.  If this
2ddb0 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
2ddc0 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  case, then do no
2ddd0 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66 65  t do the transfe
2dde0 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20 31  r.  Leave page 1
2ddf0 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20 20   empty except.  
2de00 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69 67    ** for the rig
2de10 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ht-pointer to th
2de20 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  e child page.  T
2de30 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62 65  he child page be
2de40 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  comes.    ** the
2de50 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
2de60 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 2a   the tree..    *
2de70 2f 0a 20 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20  /.    VVA_ONLY( 
2de80 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
2de90 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20 20 20 70  led = 1 );.    p
2dea0 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2deb0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2dec0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ded0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
2dee0 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
2def0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2df00 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50  gnoChild<=pagerP
2df10 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  agecount(pPage->
2df20 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
2df30 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2df40 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c  Page(pPage->pBt,
2df50 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68   pgnoChild, &pCh
2df60 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ild, 0);.    if(
2df70 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
2df80 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
2df90 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2dfa0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
2dfb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2dfc0 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2dfd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2dfe0 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
2dff0 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2e000 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2e010 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2e020 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
2e030 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
2e040 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2e050 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
2e060 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
2e070 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
2e080 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
2e090 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
2e0a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2e0b0 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2e0c0 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
2e0d0 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
2e0e0 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
2e0f0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2e100 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
2e110 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
2e120 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
2e130 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
2e140 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
2e150 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
2e160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2e170 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
2e180 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
2e190 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
2e1a0 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
2e1b0 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
2e1c0 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
2e1d0 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
2e1e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2e1f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2e200 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e210 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2e220 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2e230 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2e240 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2e250 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
2e260 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
2e270 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
2e280 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2e290 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65          rc = fre
2e2a0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2e2b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
2e2c0 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2e2d0 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
2e2e0 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
2e2f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
2e300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2e310 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
2e320 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
2e330 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
2e340 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
2e350 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
2e360 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
2e370 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
2e380 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
2e390 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2e3a0 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
2e3b0 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
2e3c0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2e3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e3e0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
2e3f0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
2e400 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
2e410 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2e420 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
2e430 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
2e440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e450 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2e460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Page);.      ass
2e470 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2e480 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65  OK );.      free
2e490 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2e4a0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2e4b0 4e 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68  NCE: transfer ch
2e4c0 69 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74  ild %d into root
2e4d0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
2e4e0 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67        pChild->pg
2e4f0 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  no, pPage->pgno)
2e500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2e510 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2e520 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e  rflow==0 );.#ifn
2e530 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e540 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2e550 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2e560 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2e570 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2e580 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2e590 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
2e5a0 64 69 66 0a 20 20 20 20 72 65 6c 65 61 73 65 50  dif.    releaseP
2e5b0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2e5c0 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c  .end_shallow_bal
2e5d0 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f  ance:.  sqlite3_
2e5e0 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  free(apCell);.  
2e5f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2e600 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61  *.** The root pa
2e610 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 0a 2a  ge is overfull.*
2e620 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 68  *.** When this h
2e630 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65 20 61  appens, Create a
2e640 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2e650 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a 2a 20  and copy the.** 
2e660 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2e670 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 63 68  root into the ch
2e680 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b 65 20  ild.  Then make 
2e690 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  the root.** page
2e6a0 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77   an empty page w
2e6b0 69 74 68 20 72 69 67 68 74 43 68 69 6c 64 20 70  ith rightChild p
2e6c0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
2e6d0 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20 20 46  ew.** child.   F
2e6e0 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62 61 6c  inally, call bal
2e6f0 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28 29 20  ance_internal() 
2e700 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  on the new child
2e710 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69 74 20  .** to cause it 
2e720 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61  to split..*/.sta
2e730 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2e740 64 65 65 70 65 72 28 42 74 43 75 72 73 6f 72 20  deeper(BtCursor 
2e750 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
2e760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e770 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
2e780 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
2e790 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2e7a0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69  Page;     /* Poi
2e7b0 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  nter to the root
2e7c0 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
2e7d0 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f  ge *pChild;    /
2e7e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
2e7f0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2e800 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2e810 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  d;     /* Page n
2e820 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
2e830 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2e840 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2e850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42          /* The B
2e860 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  Tree */.  int us
2e870 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  ableSize;     /*
2e880 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69   Total usable si
2e890 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a  ze of a page */.
2e8a0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2e8b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2e8c0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2e8d0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61  age */.  u8 *cda
2e8e0 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
2e8f0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  Content of the c
2e900 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  hild page */.  i
2e910 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
2e920 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2e930 70 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 70  page header in p
2e940 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2e950 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  brk;           /
2e960 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74  * Offset to cont
2e970 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ent of first cel
2e980 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a  l in parent */..
2e990 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e9a0 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  iPage==0 );.  as
2e9b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2e9c0 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[0]->nOverflow
2e9d0 3e 30 20 29 3b 0a 0a 20 20 56 56 41 5f 4f 4e 4c  >0 );..  VVA_ONL
2e9e0 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
2e9f0 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20 20  uffled = 1 );.  
2ea00 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2ea10 50 61 67 65 5b 30 5d 3b 0a 20 20 70 42 74 20 3d  Page[0];.  pBt =
2ea20 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61   pPage->pBt;.  a
2ea30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ea40 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2ea50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2ea60 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2ea70 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2ea80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2ea90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2eaa0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68  eePage(pBt, &pCh
2eab0 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c  ild, &pgnoChild,
2eac0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29   pPage->pgno, 0)
2ead0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2eae0 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74  urn rc;.  assert
2eaf0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2eb00 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64  writeable(pChild
2eb10 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2eb20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
2eb30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
2eb40 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2eb50 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
2eb60 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
2eb70 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65   cbrk = get2byte
2eb80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
2eb90 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64    cdata = pChild
2eba0 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70  ->aData;.  memcp
2ebb0 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68  y(cdata, &data[h
2ebc0 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c  dr], pPage->cell
2ebd0 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
2ebe0 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65  nCell-hdr);.  me
2ebf0 6d 63 70 79 28 26 63 64 61 74 61 5b 63 62 72 6b  mcpy(&cdata[cbrk
2ec00 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
2ec10 75 73 61 62 6c 65 53 69 7a 65 2d 63 62 72 6b 29  usableSize-cbrk)
2ec20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 68  ;..  assert( pCh
2ec30 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ild->isInit==0 )
2ec40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2ec50 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
2ec60 68 69 6c 64 29 3b 0a 20 20 69 66 28 20 72 63 3d  hild);.  if( rc=
2ec70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ec80 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 50    int nCopy = pP
2ec90 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  age->nOverflow*s
2eca0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2ecb0 66 6c 5b 30 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  fl[0]);.    memc
2ecc0 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c  py(pChild->aOvfl
2ecd0 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c 20  , pPage->aOvfl, 
2ece0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 70 43 68 69  nCopy);.    pChi
2ecf0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
2ed00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2ed10 3b 0a 20 20 20 20 69 66 28 20 70 43 68 69 6c 64  ;.    if( pChild
2ed20 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2ed30 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72       pChild->nFr
2ed40 65 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ee = 0;.    }.  
2ed50 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
2ed60 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e  ->nCell==pPage->
2ed70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 61 73 73  nCell );.    ass
2ed80 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ed90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2eda0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2edb0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2edc0 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2edd0 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46  a[0] & ~PTF_LEAF
2ede0 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  );.    put4byte(
2edf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2ee00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2ee10 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20  ], pgnoChild);. 
2ee20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2ee30 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
2ee40 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
2ee50 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
2ee60 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 69 66  ->pgno));.    if
2ee70 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2ee80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2ee90 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69  mapPut(pBt, pChi
2eea0 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ld->pgno, PTRMAP
2eeb0 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70  _BTREE, pPage->p
2eec0 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  gno);.#ifndef SQ
2eed0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2eee0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 72  CUUM.      if( r
2eef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ef00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 74          rc = set
2ef10 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 43 68  ChildPtrmaps(pCh
2ef20 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ild);.      }.  
2ef30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2ef40 20 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f        pChild->nO
2ef50 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
2ef60 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ef70 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
2ef80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ef90 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
2efa0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
2efb0 65 5b 31 5d 20 3d 20 70 43 68 69 6c 64 3b 0a 20  e[1] = pChild;. 
2efc0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30     pCur->aiIdx[0
2efd0 5d 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  ] = 0;.    rc = 
2efe0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2eff0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
2f000 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f010 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pChild);.  }..  
2f020 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2f030 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
2f040 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
2f050 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
2f060 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
2f070 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
2f080 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f090 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
2f0a0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
2f0b0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
2f0c0 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
2f0d0 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
2f0e0 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
2f0f0 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
2f100 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a  ng .** routine..
2f110 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ** .** Parameter
2f120 20 69 73 49 6e 73 65 72 74 20 69 73 20 74 72 75   isInsert is tru
2f130 65 20 69 66 20 61 20 6e 65 77 20 63 65 6c 6c 20  e if a new cell 
2f140 77 61 73 20 6a 75 73 74 20 69 6e 73 65 72 74 65  was just inserte
2f150 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 70 61  d into the.** pa
2f160 67 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  ge, or false oth
2f170 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
2f180 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
2f190 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2f1a0 74 20 69 73 49 6e 73 65 72 74 29 7b 0a 20 20 69  t isInsert){.  i
2f1b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f1c0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2f1d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2f1e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2f1f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2f200 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2f210 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2f220 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
2f230 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2f240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f250 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2f260 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2f270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f280 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
2f290 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ow>0 ){.      rc
2f2a0 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
2f2b0 72 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 61  r(pCur);.      a
2f2c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2f2d0 61 67 65 5b 30 5d 3d 3d 70 50 61 67 65 20 29 3b  age[0]==pPage );
2f2e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f2f0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2f300 3d 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  =0 || rc!=SQLITE
2f310 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  _OK );.    }.   
2f320 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f330 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  OK && pPage->nCe
2f340 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ll==0 ){.      r
2f350 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  c = balance_shal
2f360 6c 6f 77 65 72 28 70 43 75 72 29 3b 0a 20 20 20  lower(pCur);.   
2f370 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f380 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67  >apPage[0]==pPag
2f390 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
2f3a0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2f3b0 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51  low==0 || rc!=SQ
2f3c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
2f3d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2f3e0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2f3f0 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ow>0 || .       
2f400 20 28 21 69 73 49 6e 73 65 72 74 20 26 26 20 70   (!isInsert && p
2f410 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67  Page->nFree>pPag
2f420 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f430 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20  ze*2/3) ){.     
2f440 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
2f450 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 20  nroot(pCur);.   
2f460 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2f470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f480 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
2f490 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61   all cursors tha
2f4a0 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65  t point to table
2f4b0 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66   pgnoRoot..** If
2f4c0 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75   any of those cu
2f4d0 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65  rsors were opene
2f4e0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  d with wrFlag==0
2f4f0 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a   in a different.
2f500 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
2f510 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61  ection (a databa
2f520 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68  se connection th
2f530 61 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61  at shares the pa
2f540 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74  ger.** cache wit
2f550 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  h the current co
2f560 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68  nnection) and th
2f570 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  at other connect
2f580 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69  ion .** is not i
2f590 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  n the ReadUncomm
2f5a0 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68  mitted state, th
2f5b0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
2f5c0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
2f5d0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a  TE_LOCKED..**.**
2f5e0 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75 72 73   As well as curs
2f5f0 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ors with wrFlag=
2f600 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69 74 68  =0, cursors with
2f610 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48   .** isIncrblobH
2f620 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73  andle==1 are als
2f630 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65  o considered 're
2f640 61 64 27 20 63 75 72 73 6f 72 73 20 62 65 63 61  ad' cursors beca
2f650 75 73 65 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74  use.** increment
2f660 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2f670 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74  are used for bot
2f680 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  h reading and wr
2f690 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  iting..**.** Whe
2f6a0 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  n pgnoRoot is th
2f6b0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
2f6c0 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
2f6d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f6e0 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73   also.** respons
2f6f0 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64  ible for invalid
2f700 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61  ating incrementa
2f710 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77  l blob cursors w
2f720 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f  hen the table ro
2f730 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68  w.** on which th
2f740 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73  ey are opened is
2f750 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69   deleted or modi
2f760 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72  fied. Cursors ar
2f770 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
2f780 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
2f790 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65  e following rule
2f7a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68  s:.**.**   1) Wh
2f7b0 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61 62  en BtreeClearTab
2f7c0 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  le() is called t
2f7d0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c  o completely del
2f7e0 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ete the contents
2f7f0 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d  .**      of a B-
2f800 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63  Tree table, pExc
2f810 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a  lude is set to z
2f820 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ero and paramete
2f830 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20  r iRow is .**   
2f840 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65     set to non-ze
2f850 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
2f860 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c   all incremental
2f870 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70   blob cursors op
2f880 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  en.**      on th
2f890 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
2f8a0 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69  t pgnoRoot are i
2f8b0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2f8c0 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72 65  *   2) When Btre
2f8d0 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65  eInsert(), Btree
2f8e0 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
2f8f0 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63 61  ePutData() is ca
2f900 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20  lled to .**     
2f910 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20   modify a table 
2f920 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73  row via an SQL s
2f930 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75  tatement, pExclu
2f940 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
2f950 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20   .**      write 
2f960 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64  cursor used to d
2f970 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69  o the modificati
2f980 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72  on and parameter
2f990 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20   iRow is set.** 
2f9a0 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65       to the inte
2f9b0 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68  ger row id of th
2f9c0 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62  e B-Tree entry b
2f9d0 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55  eing modified. U
2f9e0 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45  nless.**      pE
2f9f0 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66  xclude is itself
2fa00 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
2fa10 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65  blob cursor, the
2fa20 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  n all incrementa
2fa30 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63  l.**      blob c
2fa40 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72  ursors open on r
2fa50 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42  ow iRow of the B
2fa60 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69  -Tree are invali
2fa70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33  dated..**.**   3
2fa80 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75  ) If both pExclu
2fa90 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20  de and iRow are 
2faa0 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20  set to zero, no 
2fab0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2fac0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72   .**      cursor
2fad0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2fae0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2faf0 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e   checkForReadCon
2fb00 66 6c 69 63 74 73 28 0a 20 20 42 74 72 65 65 20  flicts(.  Btree 
2fb10 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
2fb20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
2fb30 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
2fb40 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  */.  Pgno pgnoRo
2fb50 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ot,          /* 
2fb60 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63 75  Look for read cu
2fb70 72 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62 74  rsors on this bt
2fb80 72 65 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ree */.  BtCurso
2fb90 72 20 2a 70 45 78 63 6c 75 64 65 2c 20 20 20 20  r *pExclude,    
2fba0 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 69 73 20   /* Ignore this 
2fbb0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 36 34 20  cursor */.  i64 
2fbc0 69 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20  iRow            
2fbd0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
2fbe0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
2fbf0 68 61 6e 67 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  hanging */.){.  
2fc00 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2fc10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2fc20 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2fc30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2fc40 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2fc50 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2fc60 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2fc70 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2fc80 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2fc90 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2fca0 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2fcb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2fcc0 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2fcd0 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2fce0 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2fcf0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2fd00 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2fd10 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2fd20 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2fd30 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2fd40 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2fd50 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2fd60 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2fd70 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2fd80 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2fd90 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2fda0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2fdb0 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2fdc0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2fdd0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2fde0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2fdf0 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2fe00 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2fe10 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2fe20 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2fe30 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2fe40 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2fe50 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2fe60 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2fe70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 64 62  .      assert(db
2fe80 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Other);.      if
2fe90 28 20 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26  ( dbOther!=db &&
2fea0 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73   (dbOther->flags
2feb0 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2fec0 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 20 29 7b  committed)==0 ){
2fed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fee0 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2fef0 64 28 64 62 2c 20 64 62 4f 74 68 65 72 29 3b 0a  d(db, dbOther);.
2ff00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ff10 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2ff20 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20  REDCACHE;.      
2ff30 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2ff40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ff50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2ff60 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
2ff70 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
2ff80 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
2ff90 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
2ffa0 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
2ffb0 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
2ffc0 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
2ffd0 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
2ffe0 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
2fff0 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
30000 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
30010 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
30020 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
30030 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
30040 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
30050 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
30060 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
30070 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
30080 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
30090 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
300a0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
300b0 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
300c0 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
300d0 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
300e0 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ignored..*/.int 
300f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
30100 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
30110 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
30120 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
30130 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
30140 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
30150 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
30160 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
30170 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
30180 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
30190 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
301a0 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
301b0 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
301c0 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
301d0 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  cord */.  int nZ
301e0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
301f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30200 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79  er of extra 0 by
30210 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
30220 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61   data */.  int a
30230 70 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20  ppendBias       
30240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30250 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
30260 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f  ely an append */
30270 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
30280 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73  int loc;.  int s
30290 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b  zNew;.  int idx;
302a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
302b0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
302c0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
302d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
302e0 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
302f0 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
30300 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
30310 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
30320 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30330 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
30340 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30350 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
30360 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
30370 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
30380 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
30390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
303a0 46 6c 61 67 20 29 3b 0a 20 20 72 63 20 3d 20 63  Flag );.  rc = c
303b0 68 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c  heckForReadConfl
303c0 69 63 74 73 28 70 43 75 72 2d 3e 70 42 74 72 65  icts(pCur->pBtre
303d0 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
303e0 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 3b 0a  t, pCur, nKey);.
303f0 20 20 69 66 28 20 72 63 20 29 7b 20 20 20 20 20    if( rc ){     
30400 20 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20          .    /* 
30410 54 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70  The table pCur p
30420 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72  oints to has a r
30430 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
30440 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30450 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
30460 43 41 43 48 45 20 29 3b 0a 20 20 20 20 72 65 74  CACHE );.    ret
30470 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
30480 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
30490 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
304a0 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
304b0 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  >skip;.  }..  /*
304c0 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
304d0 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
304e0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
304f0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
30500 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
30510 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
30520 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54    if( .    SQLIT
30530 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
30540 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
30550 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
30560 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51  pCur)) ||.    SQ
30570 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
30580 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
30590 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b  o(pCur, pKey, nK
305a0 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20  ey, appendBias, 
305b0 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20 20 20  &loc)).  ){.    
305c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
305d0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
305e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
305f0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
30600 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
30610 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73  nKey>=0 );.  ass
30620 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
30630 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b   || !pPage->intK
30640 65 79 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  ey );.  TRACE(("
30650 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64  INSERT: table=%d
30660 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61   nkey=%lld ndata
30670 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e  =%d page=%d %s\n
30680 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  ",.          pCu
30690 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65  r->pgnoRoot, nKe
306a0 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d  y, nData, pPage-
306b0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
306c0 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77   loc==0 ? "overw
306d0 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74  rite" : "new ent
306e0 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ry"));.  assert(
306f0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
30700 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  ;.  allocateTemp
30710 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65  Space(pBt);.  ne
30720 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  wCell = pBt->pTm
30730 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65  pSpace;.  if( ne
30740 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  wCell==0 ) retur
30750 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
30760 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c    rc = fillInCel
30770 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  l(pPage, newCell
30780 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44  , pKey, nKey, pD
30790 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72  ata, nData, nZer
307a0 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66  o, &szNew);.  if
307b0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
307c0 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74  insert;.  assert
307d0 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a  ( szNew==cellSiz
307e0 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43  ePtr(pPage, newC
307f0 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
30800 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c  ( szNew<=MX_CELL
30810 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
30820 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
30830 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
30840 20 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20    if( loc==0 && 
30850 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
30860 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
30870 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
30880 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
30890 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
308a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
308b0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
308c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
308d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
308e0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
308f0 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
30900 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
30910 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
30920 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
30930 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
30940 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
30950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
30960 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
30970 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
30980 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
30990 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
309a0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
309b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
309c0 72 74 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f  rt;.    rc = dro
309d0 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  pCell(pPage, idx
309e0 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66  , szOld);.    if
309f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30a00 29 20 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  ) {.      goto e
30a10 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
30a20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
30a30 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
30a40 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
30a50 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
30a60 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70  );.    idx = ++p
30a70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
30a80 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 70 43 75  >iPage];.    pCu
30a90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
30aa0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
30ab0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65  idNKey = 0;.  }e
30ac0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
30ad0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
30ae0 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
30af0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  tCell(pPage, idx
30b00 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77  , newCell, szNew
30b10 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
30b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30b30 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
30b40 28 70 43 75 72 2c 20 31 29 3b 0a 20 20 7d 0a 0a  (pCur, 1);.  }..
30b50 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
30b60 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
30b70 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
30b80 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
30b90 63 65 28 29 0a 20 20 2a 2a 20 66 61 69 6c 73 2e  ce().  ** fails.
30ba0 20 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20    Internal data 
30bb0 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
30bc0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
30bd0 20 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20   otherwise. */. 
30be0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
30bf0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
30c00 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 69 66  rflow = 0;..  if
30c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30c20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
30c30 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
30c40 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
30c50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
30c60 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
30c70 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
30c80 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
30c90 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
30ca0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
30cb0 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
30cc0 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
30cd0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
30ce0 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
30cf0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
30d00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
30d10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
30d20 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 75  ;.  int idx;.  u
30d30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
30d40 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ell;.  int rc;. 
30d50 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20   Pgno pgnoChild 
30d60 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  = 0;.  Btree *p 
30d70 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
30d80 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
30d90 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
30da0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
30db0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
30dc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
30dd0 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
30de0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
30df0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
30e00 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
30e10 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
30e20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
30e30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
30e40 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
30e50 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
30e60 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  }.  if( NEVER(pC
30e70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
30e80 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
30e90 43 65 6c 6c 29 20 29 7b 0a 20 20 20 20 72 65 74  Cell) ){.    ret
30ea0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
30eb0 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72  ;  /* The cursor
30ec0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
30ed0 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a   to anything */.
30ee0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
30ef0 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
30f00 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
30f10 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70 43  dConflicts(p, pC
30f20 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
30f30 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ur, pCur->info.n
30f40 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Key);.  if( rc!=
30f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30f60 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
30f70 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
30f80 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
30f90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
30fa0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
30fb0 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20  AREDCACHE );.   
30fc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30fd0 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68  .  /* Restore th
30fe0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
30ff0 20 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d   position (a no-
31000 6f 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  op if the cursor
31010 20 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a   is not in .  **
31020 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
31030 45 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73  EEK state) and s
31040 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
31050 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
31060 75 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65  ursors .  ** ope
31070 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  n on the same ta
31080 62 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73  ble. Then call s
31090 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
310a0 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  () on the page. 
310b0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74   ** that the ent
310c0 72 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  ry will be delet
310d0 65 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20  ed from..  */.  
310e0 69 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72  if( .    (rc = r
310f0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
31100 74 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c  tion(pCur))!=0 |
31110 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65  |.    (rc = save
31120 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
31130 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
31140 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20  pCur))!=0 ||.   
31150 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
31160 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31170 70 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29  pDbPage))!=0.  )
31180 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
31190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
311a0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  e the cell withi
311b0 6e 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c  n its page and l
311c0 65 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74  eave pCell point
311d0 69 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ing to the.  ** 
311e0 64 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43  data. The clearC
311f0 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73  ell() call frees
31200 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
31210 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
31220 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  ith the.  ** cel
31230 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65  l. The cell itse
31240 6c 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61  lf is still inta
31250 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d  ct..  */.  idx =
31260 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
31270 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70 43 65  r->iPage];.  pCe
31280 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
31290 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 69 66 28  age, idx);.  if(
312a0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
312b0 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
312c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
312d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65  ;.  }.  rc = cle
312e0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
312f0 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ell);.  if( rc )
31300 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
31310 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
31320 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
31330 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e  /*.    ** The en
31340 74 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74  try we are about
31350 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
31360 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77  t a leaf so if w
31370 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  e do not.    ** 
31380 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20  do something we 
31390 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c  will leave a hol
313a0 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  e on an internal
313b0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65   page..    ** We
313c0 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68   have to fill th
313d0 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67  e hole by moving
313e0 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20   in a cell from 
313f0 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20  a leaf.  The.   
31400 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66   ** next Cell af
31410 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62  ter the one to b
31420 65 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61  e deleted is gua
31430 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
31440 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62   and.    ** to b
31450 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63  e a leaf so we c
31460 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a  an use it..    *
31470 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c  /.    BtCursor l
31480 65 61 66 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50  eafCur;.    MemP
31490 61 67 65 20 2a 70 4c 65 61 66 50 61 67 65 20 3d  age *pLeafPage =
314a0 20 30 3b 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65   0;..    unsigne
314b0 64 20 63 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20  d char *pNext;. 
314c0 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
314d0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
314e0 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b  r *tempCell = 0;
314f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
31500 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
31510 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47     sqlite3BtreeG
31520 65 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75  etTempCursor(pCu
31530 72 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20  r, &leafCur);.  
31540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
31550 72 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72  reeNext(&leafCur
31560 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  , &notUsed);.   
31570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
31590 72 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64  rt( leafCur.aiId
315a0 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d  x[leafCur.iPage]
315b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4c 65  ==0 );.      pLe
315c0 61 66 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72  afPage = leafCur
315d0 2e 61 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e  .apPage[leafCur.
315e0 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20 72 63  iPage];.      rc
315f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31600 72 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e  rite(pLeafPage->
31610 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
31620 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
31640 6e 74 20 6c 65 61 66 43 75 72 73 6f 72 49 6e 76  nt leafCursorInv
31650 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  alid = 0;.      
31660 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20  u16 szNext;.    
31670 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
31680 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
31690 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
316a0 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
316b0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
316c0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
316d0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
316e0 2c 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e  , pLeafPage->pgn
316f0 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70 43  o));.      dropC
31700 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
31710 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
31720 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
31730 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
31740 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30 29  ll(pLeafPage, 0)
31750 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d  ;.      szNext =
31760 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65   cellSizePtr(pLe
31770 61 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a  afPage, pNext);.
31780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 58        assert( MX
31790 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e  _CELL_SIZE(pBt)>
317a0 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20  =szNext+4 );.   
317b0 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
317c0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
317d0 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74 2d   tempCell = pBt-
317e0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
317f0 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d 3d    if( tempCell==
31800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
31810 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
31820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31830 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31840 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31850 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
31860 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20  , idx, pNext-4, 
31870 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65  szNext+4, tempCe
31880 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ll, 0);.      }.
31890 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  ..      /* The "
318a0 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  if" statement in
318b0 20 74 68 65 20 6e 65 78 74 20 63 6f 64 65 20 62   the next code b
318c0 6c 6f 63 6b 20 69 73 20 63 72 69 74 69 63 61 6c  lock is critical
318d0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
318e0 73 6c 69 67 68 74 65 73 74 20 65 72 72 6f 72 20  slightest error 
318f0 69 6e 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  in that statemen
31900 74 20 77 6f 75 6c 64 20 61 6c 6c 6f 77 20 53 51  t would allow SQ
31910 4c 69 74 65 20 74 6f 20 6f 70 65 72 61 74 65 0a  Lite to operate.
31920 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
31930 6c 79 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ly most of the t
31940 69 6d 65 20 62 75 74 20 70 72 6f 64 75 63 65 20  ime but produce 
31950 76 65 72 79 20 72 61 72 65 20 66 61 69 6c 75 72  very rare failur
31960 65 73 2e 20 20 54 6f 0a 20 20 20 20 20 20 2a 2a  es.  To.      **
31970 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 74   guard against t
31980 68 69 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  his, the followi
31990 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c 70 20 74  ng macros help t
319a0 6f 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  o verify that.  
319b0 20 20 20 20 2a 2a 20 74 68 65 20 22 69 66 22 20      ** the "if" 
319c0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 77 65 6c  statement is wel
319d0 6c 20 74 65 73 74 65 64 2e 0a 20 20 20 20 20 20  l tested..      
319e0 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
319f0 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  e( pPage->nOverf
31a00 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  low==0 && pPage-
31a10 3e 6e 46 72 65 65 3c 70 42 74 2d 3e 75 73 61 62  >nFree<pBt->usab
31a20 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20 20  leSize*2/3 .    
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
31a40 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65  pLeafPage->nFree
31a50 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74 2d  +2+szNext > pBt-
31a60 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
31a70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
31a80 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  e( pPage->nOverf
31a90 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  low==0 && pPage-
31aa0 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61  >nFree==pBt->usa
31ab0 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a 20 20 20  bleSize*2/3 .   
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
31ad0 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
31ae0 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42 74  e+2+szNext > pBt
31af0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
31b00 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
31b10 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  se( pPage->nOver
31b20 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65  flow==0 && pPage
31b30 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73  ->nFree==pBt->us
31b40 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20 0a  ableSize*2/3+1 .
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
31b70 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
31b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
31b90 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
31ba0 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
31bb0 76 65 72 66 6c 6f 77 3e 30 20 26 26 20 70 50 61  verflow>0 && pPa
31bc0 67 65 2d 3e 6e 46 72 65 65 3c 3d 70 42 74 2d 3e  ge->nFree<=pBt->
31bd0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 0a 20  usableSize*2/3. 
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bf0 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46  && pLeafPage->nF
31c00 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70  ree+2+szNext > p
31c10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
31c20 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  /3 );.      test
31c30 63 61 73 65 28 20 28 70 50 61 67 65 2d 3e 6e 4f  case( (pPage->nO
31c40 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70 50  verflow>0 || (pP
31c50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42 74  age->nFree > pBt
31c60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
31c70 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
31c80 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
31c90 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
31ca0 20 3d 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   == pBt->usableS
31cb0 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a 0a 20 20 20  ize*2/3 );...   
31cc0 20 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 6e     if( (pPage->n
31cd0 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 28 70  Overflow>0 || (p
31ce0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 20 70 42  Page->nFree > pB
31cf0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
31d00 33 29 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  3)) &&.         
31d10 20 28 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72   (pLeafPage->nFr
31d20 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20 70 42  ee+2+szNext > pB
31d30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
31d40 33 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  3).      ){.    
31d50 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
31d60 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 74  ch is taken if t
31d70 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
31d80 20 69 73 20 6e 6f 77 20 65 69 74 68 65 72 20 6f   is now either o
31d90 76 65 72 66 6c 6f 77 69 6e 67 0a 20 20 20 20 20  verflowing.     
31da0 20 20 20 2a 2a 20 6f 72 20 75 6e 64 65 72 66 75     ** or underfu
31db0 6c 6c 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ll and the leaf 
31dc0 6e 6f 64 65 20 77 69 6c 6c 20 62 65 20 75 6e 64  node will be und
31dd0 65 72 66 75 6c 6c 20 61 66 74 65 72 20 74 68 65  erfull after the
31de0 20 6a 75 73 74 20 63 65 6c 6c 20 0a 20 20 20 20   just cell .    
31df0 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 74 6f      ** copied to
31e00 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
31e10 64 65 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  de is deleted fr
31e20 6f 6d 20 69 74 2e 20 54 68 69 73 20 69 73 20 61  om it. This is a
31e30 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 20 20   special.       
31e40 20 2a 2a 20 63 61 73 65 20 62 65 63 61 75 73 65   ** case because
31e50 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c   the call to bal
31e60 61 6e 63 65 28 29 20 74 6f 20 63 6f 72 72 65 63  ance() to correc
31e70 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  t the internal n
31e80 6f 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ode.        ** m
31e90 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 74 72  ay change the tr
31ea0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
31eb0 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
31ec0 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20 20  contents of.    
31ed0 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66 43      ** the leafC
31ee0 75 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  ur.apPage[] and 
31ef0 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 5d 20  leafCur.aiIdx[] 
31f00 61 72 72 61 79 73 2c 20 77 68 69 63 68 20 77 69  arrays, which wi
31f10 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
31f20 20 75 73 65 64 20 62 79 20 74 68 65 20 62 61 6c   used by the bal
31f30 61 6e 63 65 28 29 20 72 65 71 75 69 72 65 64 20  ance() required 
31f40 74 6f 20 63 6f 72 72 65 63 74 20 74 68 65 20 75  to correct the u
31f50 6e 64 65 72 66 75 6c 6c 20 6c 65 61 66 0a 20 20  nderfull leaf.  
31f60 20 20 20 20 20 20 2a 2a 20 6e 6f 64 65 2e 0a 20        ** node.. 
31f70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31f80 20 20 2a 2a 20 54 68 65 20 66 6f 72 6d 75 6c 61    ** The formula
31f90 20 75 73 65 64 20 69 6e 20 74 68 65 20 65 78 70   used in the exp
31fa0 72 65 73 73 69 6f 6e 20 61 62 6f 76 65 20 61 72  ression above ar
31fb0 65 20 62 61 73 65 64 20 6f 6e 20 66 61 63 65 74  e based on facet
31fc0 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
31fd0 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 2d  the SQLite file-
31fe0 66 6f 72 6d 61 74 20 74 68 61 74 20 64 6f 20 6e  format that do n
31ff0 6f 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20 74  ot change over t
32000 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ime..        */.
32010 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32020 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d  ( pPage->nFree==
32030 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
32040 32 2f 33 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  2/3+1 );.       
32050 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 61 66   testcase( pLeaf
32060 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
32070 4e 65 78 74 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Next==pBt->usabl
32080 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20  eSize*2/3+1 );. 
32090 20 20 20 20 20 20 20 6c 65 61 66 43 75 72 73 6f         leafCurso
320a0 72 49 6e 76 61 6c 69 64 20 3d 20 31 3b 0a 20 20  rInvalid = 1;.  
320b0 20 20 20 20 7d 20 20 20 20 20 20 20 20 0a 0a 20      }        .. 
320c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
320d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
320e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
320f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32100 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32110 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ) );.        put
32120 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
32130 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  owCell(pPage, id
32140 78 29 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  x), pgnoChild);.
32150 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59          VVA_ONLY
32160 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75  ( pCur->pagesShu
32170 66 66 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 20  ffled = 0 );.   
32180 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
32190 65 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  e(pCur, 0);.    
321a0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
321b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
321c0 6c 65 61 66 43 75 72 73 6f 72 49 6e 76 61 6c 69  leafCursorInvali
321d0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
321e0 54 68 65 20 6c 65 61 66 2d 6e 6f 64 65 20 69 73  The leaf-node is
321f0 20 6e 6f 77 20 75 6e 64 65 72 66 75 6c 6c 20 61   now underfull a
32200 6e 64 20 73 6f 20 74 68 65 20 74 72 65 65 20 6e  nd so the tree n
32210 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
32220 20 20 20 20 2a 2a 20 72 65 62 61 6c 61 6e 63 65      ** rebalance
32230 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  d. However, the 
32240 62 61 6c 61 6e 63 65 28 29 20 6f 70 65 72 61 74  balance() operat
32250 69 6f 6e 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  ion on the inter
32260 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  nal.        ** n
32270 6f 64 65 20 61 62 6f 76 65 20 6d 61 79 20 68 61  ode above may ha
32280 76 65 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ve modified the 
32290 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  structure of the
322a0 20 42 2d 54 72 65 65 20 61 6e 64 0a 20 20 20 20   B-Tree and.    
322b0 20 20 20 20 2a 2a 20 73 6f 20 74 68 65 20 63 75      ** so the cu
322c0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
322d0 66 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  f leafCur.apPage
322e0 5b 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61  [] and leafCur.a
322f0 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a  iIdx[].        *
32300 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  * may not be tru
32310 73 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  sted..        **
32320 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 69  .        ** It i
32330 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
32340 6f 20 63 6f 70 79 20 74 68 65 20 61 6e 63 65 73  o copy the ances
32350 74 72 79 20 66 72 6f 6d 20 70 43 75 72 2c 20 61  try from pCur, a
32360 73 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20  s the same.     
32370 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 28 29 20     ** balance() 
32380 63 61 6c 6c 20 68 61 73 20 69 6e 76 61 6c 69 64  call has invalid
32390 61 74 65 64 20 74 68 65 20 70 43 75 72 2d 3e 61  ated the pCur->a
323a0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
323b0 78 5b 5d 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  x[].        ** a
323c0 72 72 61 79 73 2e 20 0a 20 20 20 20 20 20 20 20  rrays. .        
323d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
323e0 65 20 63 61 6c 6c 20 74 6f 20 73 61 76 65 43 75  e call to saveCu
323f0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 62  rsorPosition() b
32400 65 6c 6f 77 20 69 6e 74 65 72 6e 61 6c 6c 79 20  elow internally 
32410 73 61 76 65 73 20 74 68 65 20 0a 20 20 20 20 20  saves the .     
32420 20 20 20 2a 2a 20 6b 65 79 20 74 68 61 74 20 6c     ** key that l
32430 65 61 66 43 75 72 20 69 73 20 63 75 72 72 65 6e  eafCur is curren
32440 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
32450 20 43 75 72 72 65 6e 74 6c 79 2c 20 74 68 65 72   Currently, ther
32460 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65  e.        ** are
32470 20 74 77 6f 20 63 6f 70 69 65 73 20 6f 66 20 74   two copies of t
32480 68 61 74 20 6b 65 79 20 69 6e 20 74 68 65 20 74  hat key in the t
32490 72 65 65 20 2d 20 6f 6e 65 20 68 65 72 65 20 6f  ree - one here o
324a0 6e 20 74 68 65 20 6c 65 61 66 0a 20 20 20 20 20  n the leaf.     
324b0 20 20 20 2a 2a 20 70 61 67 65 20 61 6e 64 20 6f     ** page and o
324c0 6e 65 20 6f 6e 20 73 6f 6d 65 20 69 6e 74 65 72  ne on some inter
324d0 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  nal node in the 
324e0 74 72 65 65 2e 20 54 68 65 20 63 6f 70 79 20 6f  tree. The copy o
324f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
32500 20 6c 65 61 66 20 6e 6f 64 65 20 69 73 20 61 6c   leaf node is al
32510 77 61 79 73 20 74 68 65 20 6e 65 78 74 20 6b 65  ways the next ke
32520 79 20 69 6e 20 74 72 65 65 2d 6f 72 64 65 72 20  y in tree-order 
32530 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
32540 20 20 20 2a 2a 20 63 6f 70 79 20 6f 6e 20 74 68     ** copy on th
32550 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  e internal node.
32560 20 53 6f 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f   So, the call to
32570 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
32580 74 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  t().        ** c
32590 61 6c 6c 73 20 72 65 73 74 6f 72 65 43 75 72 73  alls restoreCurs
325a0 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 74 6f 20  orPosition() to 
325b0 70 6f 69 6e 74 20 74 68 65 20 63 75 72 73 6f 72  point the cursor
325c0 20 74 6f 20 74 68 65 20 63 6f 70 79 0a 20 20 20   to the copy.   
325d0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 6f       ** stored o
325e0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
325f0 6f 64 65 2c 20 74 68 65 6e 20 61 64 76 61 6e 63  ode, then advanc
32600 65 73 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  es to the next e
32610 6e 74 72 79 2c 0a 20 20 20 20 20 20 20 20 2a 2a  ntry,.        **
32620 20 77 68 69 63 68 20 68 61 70 70 65 6e 73 20 74   which happens t
32630 6f 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  o be the copy of
32640 20 74 68 65 20 6b 65 79 20 6f 6e 20 74 68 65 20   the key on the 
32650 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 0a 20  internal node.. 
32660 20 20 20 20 20 20 20 2a 2a 20 4e 65 74 20 65 66         ** Net ef
32670 66 65 63 74 3a 20 6c 65 61 66 43 75 72 20 69 73  fect: leafCur is
32680 20 70 6f 69 6e 74 69 6e 67 20 62 61 63 6b 20 74   pointing back t
32690 6f 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  o the duplicate 
326a0 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  cell.        ** 
326b0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
326c0 20 72 65 6d 6f 76 65 64 2c 20 61 6e 64 20 74 68   removed, and th
326d0 65 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65  e leafCur.apPage
326e0 5b 5d 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  [] and.        *
326f0 2a 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b  * leafCur.aiIdx[
32700 5d 20 61 72 72 61 79 73 20 61 72 65 20 63 6f 72  ] arrays are cor
32710 72 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  rect..        */
32720 0a 20 20 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c  .        VVA_ONL
32730 59 28 20 50 67 6e 6f 20 6c 65 61 66 50 67 6e 6f  Y( Pgno leafPgno
32740 20 3d 20 70 4c 65 61 66 50 61 67 65 2d 3e 70 67   = pLeafPage->pg
32750 6e 6f 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  no );.        rc
32760 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
32770 69 74 69 6f 6e 28 26 6c 65 61 66 43 75 72 29 3b  ition(&leafCur);
32780 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
327a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
327b0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
327c0 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
327d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
327e0 20 20 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d       pLeafPage =
327f0 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
32800 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a  leafCur.iPage];.
32810 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32820 70 4c 65 61 66 50 61 67 65 2d 3e 70 67 6e 6f 3d  pLeafPage->pgno=
32830 3d 6c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 20  =leafPgno );.   
32840 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32850 66 43 75 72 2e 61 69 49 64 78 5b 6c 65 61 66 43  fCur.aiIdx[leafC
32860 75 72 2e 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a  ur.iPage]==0 );.
32870 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
32880 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
32890 0a 20 20 20 20 20 20 20 26 26 20 53 51 4c 49 54  .       && SQLIT
328a0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
328b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c  te3PagerWrite(pL
328c0 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61 67 65  eafPage->pDbPage
328d0 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
328e0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 4c       dropCell(pL
328f0 65 61 66 50 61 67 65 2c 20 30 2c 20 73 7a 4e 65  eafPage, 0, szNe
32900 78 74 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41  xt);.        VVA
32910 5f 4f 4e 4c 59 28 20 6c 65 61 66 43 75 72 2e 70  _ONLY( leafCur.p
32920 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30  agesShuffled = 0
32930 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
32940 20 62 61 6c 61 6e 63 65 28 26 6c 65 61 66 43 75   balance(&leafCu
32950 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  r, 0);.        a
32960 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 73 6f  ssert( leafCurso
32970 72 49 6e 76 61 6c 69 64 20 7c 7c 20 21 6c 65 61  rInvalid || !lea
32980 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c  fCur.pagesShuffl
32990 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
329a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329b0 20 20 20 20 20 20 7c 7c 20 21 70 43 75 72 2d 3e        || !pCur->
329c0 70 61 67 65 73 53 68 75 66 66 6c 65 64 20 29 3b  pagesShuffled );
329d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
329e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
329f0 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72  eleaseTempCursor
32a00 28 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65  (&leafCur);.  }e
32a10 6c 73 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28  lse{.    TRACE((
32a20 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
32a30 64 20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65  d delete from le
32a40 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  af %d\n",.      
32a50 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
32a60 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
32a70 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c      rc = dropCel
32a80 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 63 65  l(pPage, idx, ce
32a90 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
32aa0 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 69 66   pCell));.    if
32ab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32ac0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
32ad0 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
32ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
32af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32b00 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  .    moveToRoot(
32b10 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pCur);.  }.  ret
32b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
32b30 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54   Create a new BT
32b40 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74  ree table.  Writ
32b50 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20  e into *piTable 
32b60 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
32b70 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  er for the root 
32b80 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20  page of the new 
32b90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
32ba0 20 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73   type of type is
32bb0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
32bc0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
32bd0 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a  er.  Only the.**
32be0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
32bf0 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63  s of flags are c
32c00 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e  urrently in use.
32c10 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66    Other values f
32c20 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68  or.** flags migh
32c30 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a  t not work:.**.*
32c40 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b  *     BTREE_INTK
32c50 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54  EY|BTREE_LEAFDAT
32c60 41 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53  A     Used for S
32c70 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72  QL tables with r
32c80 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20  owid keys.**    
32c90 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20   BTREE_ZERODATA 
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cb0 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e   Used for SQL in
32cc0 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  dices.*/.static 
32cd0 69 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54  int btreeCreateT
32ce0 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
32cf0 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74  nt *piTable, int
32d00 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61   flags){.  BtSha
32d10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
32d20 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  t;.  MemPage *pR
32d30 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  oot;.  Pgno pgno
32d40 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Root;.  int rc;.
32d50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32d60 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
32d70 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
32d80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
32d90 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
32da0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
32db0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
32dc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
32dd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32de0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
32df0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
32e00 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
32e10 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
32e20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
32e30 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
32e40 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
32e50 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
32e60 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
32e70 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
32e80 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
32e90 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
32ea0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
32eb0 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
32ec0 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
32ed0 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
32ee0 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
32ef0 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
32f00 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
32f10 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
32f20 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
32f30 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
32f40 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
32f50 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
32f60 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
32f70 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
32f80 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
32f90 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
32fa0 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
32fb0 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
32fc0 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
32fd0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
32fe0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
32ff0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
33000 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
33010 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
33020 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33030 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
33040 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
33050 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
33060 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
33070 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
33080 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
33090 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
330a0 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
330b0 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
330c0 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
330d0 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
330e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
330f0 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
33100 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
33110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33120 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
33130 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67  rc;.    }.    pg
33140 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
33150 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
33160 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
33170 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
33180 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
33190 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
331a0 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
331b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
331c0 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
331d0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
331e0 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
331f0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
33200 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33210 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
33220 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
33230 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
33240 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
33250 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
33260 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
33270 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
33280 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
33290 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
332a0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
332b0 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
332c0 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
332d0 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
332e0 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
332f0 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
33300 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
33310 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
33320 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
33330 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
33340 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
33350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33360 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
33370 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
33380 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
33390 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
333a0 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
333b0 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
333c0 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
333d0 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
333e0 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
333f0 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
33400 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
33410 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
33420 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
33430 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
33440 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
33450 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
33460 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
33470 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
33480 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
33490 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
334a0 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
334b0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
334c0 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
334d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
334e0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
334f0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
33500 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33510 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
33520 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
33530 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
33540 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
33550 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
33560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
33570 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33580 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
33590 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
335a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
335b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
335c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
335d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
335e0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
335f0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
33600 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
33620 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
33630 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
33640 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
33650 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
33660 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
33670 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
33680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33690 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
336a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
336b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
336c0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
336d0 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
336e0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
336f0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
33700 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
33710 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20  gnoMove, 0);.   
33720 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33730 52 6f 6f 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Root);..      /*
33740 20 4f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   Obtain the page
33750 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a   at pgnoRoot */.
33760 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33780 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33790 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
337a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
337b0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f  Page(pBt, pgnoRo
337c0 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a  ot, &pRoot, 0);.
337d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
337e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
337f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33800 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
33810 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33820 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
33830 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33850 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
33860 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
33870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33880 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
33890 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 70  .      pRoot = p
338a0 50 61 67 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20  PageMove;.    } 
338b0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
338c0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
338d0 61 6e 64 20 6d 65 74 61 2d 64 61 74 61 20 77 69  and meta-data wi
338e0 74 68 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d  th the new root-
338f0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
33900 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
33910 75 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ut(pBt, pgnoRoot
33920 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
33930 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  E, 0);.    if( r
33940 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
33950 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
33960 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33970 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
33980 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
33990 65 4d 65 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f  eMeta(p, 4, pgno
339a0 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
339b0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  c ){.      relea
339c0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
339d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
339e0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
339f0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
33a00 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
33a10 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
33a20 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 1, 0);.    if
33a30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
33a40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61  ;.  }.#endif.  a
33a50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
33a60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33a70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
33a80 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f  ;.  zeroPage(pRo
33a90 6f 74 2c 20 66 6c 61 67 73 20 7c 20 50 54 46 5f  ot, flags | PTF_
33aa0 4c 45 41 46 29 3b 0a 20 20 73 71 6c 69 74 65 33  LEAF);.  sqlite3
33ab0 50 61 67 65 72 55 6e 72 65 66 28 70 52 6f 6f 74  PagerUnref(pRoot
33ac0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  ->pDbPage);.  *p
33ad0 69 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 70 67  iTable = (int)pg
33ae0 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e  noRoot;.  return
33af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e   SQLITE_OK;.}.in
33b00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72  t sqlite3BtreeCr
33b10 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
33b20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
33b30 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
33b40 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
33b50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
33b60 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
33b70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
33b80 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c  eeCreateTable(p,
33b90 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29   piTable, flags)
33ba0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
33bb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
33bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33bd0 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20  Erase the given 
33be0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e  database page an
33bf0 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72  d all its childr
33c00 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  en.  Return.** t
33c10 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
33c20 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  reelist..*/.stat
33c30 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61  ic int clearData
33c40 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68  basePage(.  BtSh
33c50 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
33c60 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
33c70 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
33c80 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50  the table */.  P
33c90 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
33ca0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33cb0 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a  ber to clear */.
33cc0 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
33cd0 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag,     /* Deall
33ce0 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
33cf0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  ue */.  int *pnC
33d00 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61  hange.){.  MemPa
33d10 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
33d20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
33d30 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
33d40 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
33d50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33d60 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
33d70 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  ex) );.  if( pgn
33d80 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
33d90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
33da0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33db0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
33dc0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
33dd0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
33de0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
33df0 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
33e00 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
33e10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
33e20 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
33e30 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
33e40 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
33e50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
33e60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
33e70 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
33e80 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
33e90 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e  te(pCell), 1, pn
33ea0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69  Change);.      i
33eb0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
33ec0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
33ed0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
33ee0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
33ef0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
33f00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
33f10 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
33f20 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  out;.  }.  if( !
33f30 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
33f40 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
33f50 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
33f60 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
33f70 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e  aData[8]), 1, pn
33f80 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28  Change);.    if(
33f90 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
33fa0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
33fb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e  ;.  }else if( pn
33fc0 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73  Change ){.    as
33fd0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
33fe0 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68  Key );.    *pnCh
33ff0 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e  ange += pPage->n
34000 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Cell;.  }.  if( 
34010 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a  freePageFlag ){.
34020 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
34030 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  e(pPage);.  }els
34040 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69  e if( (rc = sqli
34050 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34060 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d  age->pDbPage))==
34070 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67  0 ){.    zeroPag
34080 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
34090 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c  aData[0] | PTF_L
340a0 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72  EAF);.  }..clear
340b0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
340c0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
340d0 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  pPage);.  return
340e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
340f0 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  lete all informa
34100 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67  tion from a sing
34110 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  le table in the 
34120 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c  database.  iTabl
34130 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  e is.** the page
34140 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
34150 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  oot of the table
34160 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
34170 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a  utine returns,.*
34180 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
34190 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74  is empty, but st
341a0 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ill exists..**.*
341b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
341c0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51  ill fail with SQ
341d0 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74  LITE_LOCKED if t
341e0 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65  here are any ope
341f0 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72  n.** read cursor
34200 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s on the table. 
34210 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72 73   Open write curs
34220 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  ors are moved to
34230 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20   the.** root of 
34240 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
34250 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20   If pnChange is 
34260 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
34270 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74  able iTable must
34280 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   be an intkey ta
34290 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ble. The.** inte
342a0 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65  ger value pointe
342b0 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65  d to by pnChange
342c0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
342d0 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
342e0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74  .** entries in t
342f0 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  he table..*/.int
34300 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
34310 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  arTable(Btree *p
34320 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
34330 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20  t *pnChange){.  
34340 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
34350 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
34360 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
34370 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
34380 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  >db = p->db;.  a
34390 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
343a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
343b0 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 63 68  ;.  if( (rc = ch
343c0 65 63 6b 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69  eckForReadConfli
343d0 63 74 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cts(p, iTable, 0
343e0 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , 1))!=SQLITE_OK
343f0 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69   ){.    /* nothi
34400 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65  ng to do */.  }e
34410 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  lse if( SQLITE_O
34420 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
34430 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69 54 61  Cursors(pBt, iTa
34440 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  ble, 0)) ){.    
34450 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f  /* nothing to do
34460 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
34470 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
34480 61 73 65 50 61 67 65 28 70 42 74 2c 20 28 50 67  asePage(pBt, (Pg
34490 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20 70 6e  no)iTable, 0, pn
344a0 43 68 61 6e 67 65 29 3b 0a 20 20 7d 0a 20 20 73  Change);.  }.  s
344b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
344c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
344d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
344e0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
344f0 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
34500 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
34510 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
34520 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
34530 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
34540 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
34550 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
34560 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
34570 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
34580 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
34590 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
345a0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
345b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
345c0 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
345d0 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
345e0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
345f0 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
34600 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
34610 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
34620 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
34630 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
34640 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
34650 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
34660 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
34670 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
34680 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
34690 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
346a0 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
346b0 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
346c0 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
346d0 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
346e0 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
346f0 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
34700 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
34710 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
34720 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
34730 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
34740 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
34750 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
34760 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
34770 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
34780 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
34790 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
347a0 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
347b0 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
347c0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
347d0 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
347e0 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
347f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
34800 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
34810 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
34820 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
34830 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
34840 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
34850 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
34860 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
34870 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
34880 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
34890 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
348a0 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
348b0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
348c0 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
348d0 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 69  , Pgno iTable, i
348e0 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
348f0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
34900 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
34910 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34920 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
34930 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
34940 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
34950 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
34960 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
34970 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  E );..  /* It is
34980 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70   illegal to drop
34990 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
349a0 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
349b0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
349c0 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
349d0 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
349e0 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
349f0 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
34a00 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f  need to move ano
34a10 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74  ther root-page t
34a20 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66  o fill a gap lef
34a30 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
34a40 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  .  ** root page.
34a50 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   If an open curs
34a60 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69  or was using thi
34a70 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d  s page a problem
34a80 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63   would .  ** occ
34a90 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
34aa0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
34ab0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
34ac0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
34ad0 62 2c 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d  b, pBt->pCursor-
34ae0 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
34af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34b00 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
34b10 48 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  HE;.  }..  rc = 
34b20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
34b30 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69  age(pBt, (Pgno)i
34b40 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30  Table, &pPage, 0
34b50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
34b60 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
34b70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
34b80 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65  rTable(p, iTable
34b90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
34ba0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
34bb0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
34bc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
34bd0 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20  *piMoved = 0;.. 
34be0 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b   if( iTable>1 ){
34bf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
34c00 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34c10 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
34c20 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c  (pPage);.    rel
34c30 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34c40 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
34c50 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
34c60 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78  {.      Pgno max
34c70 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20  RootPgno;.      
34c80 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
34c90 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26  eGetMeta(p, 4, &
34ca0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
34cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34cd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
34ce0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ge);.        ret
34cf0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
34d00 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c  .      if( iTabl
34d10 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29  e==maxRootPgno )
34d20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
34d30 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
34d40 64 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74  dropped is the t
34d50 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61  able with the la
34d60 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
34d70 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
34d80 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
34d90 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20  e, put the root 
34da0 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
34db0 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20   list. .        
34dc0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
34dd0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
34de0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
34df0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
34e00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34e10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
34e50 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   The table being
34e60 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f   dropped does no
34e70 74 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65  t have the large
34e80 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
34e90 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69       ** number i
34ea0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
34eb0 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  So move the page
34ec0 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20   that does into 
34ed0 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
34ee0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
34ef0 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67  deleted root-pag
34f00 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
34f10 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
34f20 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65  Move;.        re
34f30 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
34f40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
34f50 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
34f60 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  ge(pBt, maxRootP
34f70 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b  gno, &pMove, 0);
34f80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34fa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34fb0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
34fc0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
34fd0 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76  tePage(pBt, pMov
34fe0 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e, PTRMAP_ROOTPA
34ff0 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 2c 20 30  GE, 0, iTable, 0
35000 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
35010 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
35020 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
35030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35040 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35050 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
35070 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
35080 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
35090 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
350a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
350b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
350c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
350d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
350e0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76   = freePage(pMov
350f0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
35100 61 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  asePage(pMove);.
35110 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35130 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
35140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35150 20 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d      *piMoved = m
35160 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
35170 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65    }..      /* Se
35180 74 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72  t the new 'max-r
35190 6f 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20  oot-page' value 
351a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
351b0 68 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20  header. This.   
351c0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64     ** is the old
351d0 20 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c   value less one,
351e0 20 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69   less one more i
351f0 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74  f that happens t
35200 6f 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20  o.      ** be a 
35210 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
35220 2c 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e  , less one again
35230 20 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a   if that is the.
35240 20 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47        ** PENDING
35250 5f 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20  _BYTE_PAGE..    
35260 20 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f    */.      maxRo
35270 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
35280 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
35290 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
352a0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
352b0 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
352c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
352d0 69 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d  if( maxRootPgno=
352e0 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
352f0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  Bt, maxRootPgno)
35300 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
35310 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
35320 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
35330 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45   maxRootPgno!=PE
35340 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
35350 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72  pBt) );..      r
35360 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
35370 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
35380 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20   maxRootPgno);. 
35390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
353a0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
353b0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  age);.      rele
353c0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
353d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
353e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
353f0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
35400 54 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64  Table was called
35410 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
35420 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
35430 65 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  e, PTF_INTKEY|PT
35440 46 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65  F_LEAF );.    re
35450 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
35460 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
35470 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  c;  .}.int sqlit
35480 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
35490 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
354a0 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f  Table, int *piMo
354b0 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
354c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
354d0 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
354e0 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
354f0 72 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61  rc = btreeDropTa
35500 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ble(p, iTable, p
35510 69 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74  iMoved);.  sqlit
35520 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
35530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35540 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
35550 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
35560 6e 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62  n out of a datab
35570 61 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b  ase file.  Meta[
35580 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d  0].** is the num
35590 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65  ber of free page
355a0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
355b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
355c0 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68  ta[1].** through
355d0 20 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76   meta[15] are av
355e0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
355f0 62 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73  by higher layers
35600 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
35610 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20   read-only, the 
35620 6f 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f  others are read/
35630 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  write..** .** Th
35640 65 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e  e schema layer n
35650 75 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75  umbers meta valu
35660 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20  es differently. 
35670 20 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   At the schema.*
35680 2a 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65  * layer (and the
35690 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52   SetCookie and R
356a0 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65  eadCookie opcode
356b0 73 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  s) the number of
356c0 0a 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69  .** free pages i
356d0 73 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20  s not visible.  
356e0 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20  So Cookie[0] is 
356f0 74 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61  the same as Meta
35700 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  [1]..*/.int sqli
35710 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
35720 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
35730 78 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a  x, u32 *pMeta){.
35740 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
35750 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
35760 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35770 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
35780 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35790 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
357a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
357b0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  >db = p->db;..  
357c0 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
357d0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
357e0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
357f0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
35800 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
35810 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
35820 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
35830 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
35840 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
35850 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
35860 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
35870 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
35880 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
35890 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
358a0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
358b0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
358c0 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
358d0 65 54 61 62 6c 65 4c 6f 63 6b 28 29 0a 20 20 2a  eTableLock().  *
358e0 2a 20 61 6e 64 20 73 65 74 53 68 61 72 65 64 43  * and setSharedC
358f0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
35900 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ..  */.  rc = qu
35910 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
35920 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45  bleLock(p, 1, RE
35930 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
35940 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35950 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
35960 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
35970 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
35980 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
35990 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
359a0 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
359b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d  ){.    /* The b-
359c0 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
359d0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
359e0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66  nce to page 1 of
359f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
35a00 20 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68    ** file. In th
35a10 69 73 20 63 61 73 65 20 74 68 65 20 72 65 71 75  is case the requ
35a20 69 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20 76  ired meta-data v
35a30 61 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61 64  alue can be read
35a40 20 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a   directly.    **
35a50 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 64   from the page d
35a60 61 74 61 20 6f 66 20 74 68 69 73 20 72 65 66 65  ata of this refe
35a70 72 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20 73  rence. This is s
35a80 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
35a90 68 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75 65  han.    ** reque
35aa0 73 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66 65  sting a new refe
35ab0 72 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 70  rence from the p
35ac0 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20  ager layer..    
35ad0 2a 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e  */.    pP1 = (un
35ae0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42  signed char *)pB
35af0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
35b00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
35b10 2a 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f 65  * The b-tree doe
35b20 73 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 66  s not have a ref
35b30 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
35b40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
35b50 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62   file..    ** Ob
35b60 74 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68  tain one from th
35b70 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20  e pager layer.. 
35b80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
35b90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
35ba0 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26  Bt->pPager, 1, &
35bb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
35bc0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ( rc ){.      sq
35bd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
35be0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
35bf0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
35c00 50 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  P1 = (unsigned c
35c10 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67  har *)sqlite3Pag
35c20 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
35c30 65 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61  e);.  }.  *pMeta
35c40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31   = get4byte(&pP1
35c50 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a  [36 + idx*4]);..
35c60 20 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74 72    /* If the b-tr
35c70 65 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  ee is not holdin
35c80 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
35c90 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e   page 1, then on
35ca0 65 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71 75  e was .  ** requ
35cb0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ested from the p
35cc0 61 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74 68  ager layer in th
35cd0 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52  e above block. R
35ce0 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
35cf0 20 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   */.  if( !pBt->
35d00 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73 71  pPage1 ){.    sq
35d10 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35d20 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  pDbPage);.  }.. 
35d30 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75   /* If autovacuu
35d40 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20  med is disabled 
35d50 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75  in this build bu
35d60 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  t we are trying 
35d70 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20  to .  ** access 
35d80 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20  an autovacuumed 
35d90 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d  database, then m
35da0 61 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ake the database
35db0 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f   readonly. .  */
35dc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
35dd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35de0 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a   if( idx==4 && *
35df0 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72  pMeta>0 ) pBt->r
35e00 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e  eadOnly = 1;.#en
35e10 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74  dif..  /* Grab t
35e20 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  he read-lock on 
35e30 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20  page 1. */.  rc 
35e40 3d 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  = setSharedCache
35e50 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
35e60 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  READ_LOCK);.  sq
35e70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
35e80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
35e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
35ea0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
35eb0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
35ec0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
35ed0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
35ee0 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
35ef0 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
35f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
35f10 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
35f20 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
35f30 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
35f40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
35f50 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35f60 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
35f70 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
35f80 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
35f90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
35fa0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
35fb0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
35fc0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
35fd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
35fe0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
35ff0 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50  Page1!=0 );.  pP
36000 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  1 = pBt->pPage1-
36010 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
36020 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36030 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
36040 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
36050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36060 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31     put4byte(&pP1
36070 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d  [36 + idx*4], iM
36080 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eta);.#ifndef SQ
36090 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
360a0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 69 64 78  CUUM.    if( idx
360b0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
360c0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
360d0 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
360e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
360f0 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d  ( iMeta==0 || iM
36100 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  eta==1 );.      
36110 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
36120 3d 20 28 75 38 29 69 4d 65 74 61 3b 0a 20 20 20  = (u8)iMeta;.   
36130 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
36140 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
36150 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
36160 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
36170 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65  rn the flag byte
36180 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
36190 67 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  g of the page th
361a0 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  at the cursor.**
361b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
361c0 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e  inting to..*/.in
361d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c  t sqlite3BtreeFl
361e0 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
361f0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
36200 57 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f  What about CURSO
36210 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74  R_REQUIRESEEK st
36220 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65  ate? Probably ne
36230 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20  ed to call.  ** 
36240 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
36250 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
36260 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
36270 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 43 75  age;.  restoreCu
36280 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
36290 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  r);.  pPage = pC
362a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
362b0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
362c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
362d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
362e0 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
362f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36300 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70  ge->pBt==pCur->p
36310 42 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Bt );.  return p
36320 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
36330 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 3b 0a 7d  e->hdrOffset];.}
36340 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36350 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
36360 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
36370 20 61 72 67 75 6d 65 6e 74 2c 20 70 43 75 72 2c   argument, pCur,
36380 20 69 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65   is a cursor ope
36390 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 62 2d 74 72  ned on some b-tr
363a0 65 65 2e 20 43 6f 75 6e 74 20 74 68 65 0a 2a 2a  ee. Count the.**
363b0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
363c0 65 73 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  es in the b-tree
363d0 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 72   and write the r
363e0 65 73 75 6c 74 20 74 6f 20 2a 70 6e 45 6e 74 72  esult to *pnEntr
363f0 79 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  y..**.** SQLITE_
36400 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
36410 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
36420 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
36430 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 4f 74  executed. .** Ot
36440 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 20 65  herwise, if an e
36450 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
36460 72 65 64 20 28 69 2e 65 2e 20 61 6e 20 49 4f 20  red (i.e. an IO 
36470 65 72 72 6f 72 20 6f 72 20 64 61 74 61 62 61 73  error or databas
36480 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 29  e.** corruption)
36490 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
364a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
364b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
364c0 33 42 74 72 65 65 43 6f 75 6e 74 28 42 74 43 75  3BtreeCount(BtCu
364d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
364e0 2a 70 6e 45 6e 74 72 79 29 7b 0a 20 20 69 36 34  *pnEntry){.  i64
364f0 20 6e 45 6e 74 72 79 20 3d 20 30 3b 20 20 20 20   nEntry = 0;    
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
36520 74 75 72 6e 20 69 6e 20 2a 70 6e 45 6e 74 72 79  turn in *pnEntry
36530 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
36560 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 72  turn code */.  r
36570 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
36580 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  Cur);..  /* Unle
36590 73 73 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ss an error occu
365a0 72 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rs, the followin
365b0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 65 20  g loop runs one 
365c0 69 74 65 72 61 74 69 6f 6e 20 66 6f 72 20 65 61  iteration for ea
365d0 63 68 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  ch.  ** page in 
365e0 74 68 65 20 42 2d 54 72 65 65 20 73 74 72 75 63  the B-Tree struc
365f0 74 75 72 65 20 28 6e 6f 74 20 69 6e 63 6c 75 64  ture (not includ
36600 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
36610 65 73 29 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  es). .  */.  whi
36620 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
36630 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64  K ){.    int iId
36640 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
36650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
36660 6e 64 65 78 20 6f 66 20 63 68 69 6c 64 20 6e 6f  ndex of child no
36670 64 65 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  de in parent */.
36680 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
36690 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
366a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
366b0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
366c0 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  tree */..    /* 
366d0 49 66 20 74 68 69 73 20 69 73 20 61 20 6c 65 61  If this is a lea
366e0 66 20 70 61 67 65 20 6f 72 20 74 68 65 20 74 72  f page or the tr
366f0 65 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  ee is not an int
36700 2d 6b 65 79 20 74 72 65 65 2c 20 74 68 65 6e 20  -key tree, then 
36710 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 70 61 67  .    ** this pag
36720 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 75 6e 74  e contains count
36730 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 49 6e  able entries. In
36740 63 72 65 6d 65 6e 74 20 74 68 65 20 65 6e 74 72  crement the entr
36750 79 20 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a  y counter.    **
36760 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 20 20   accordingly..  
36770 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 20 3d    */.    pPage =
36780 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
36790 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
367a0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
367b0 7c 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || !pPage->intKe
367c0 79 20 29 7b 0a 20 20 20 20 20 20 6e 45 6e 74 72  y ){.      nEntr
367d0 79 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  y += pPage->nCel
367e0 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  l;.    }..    /*
367f0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
36800 20 6e 6f 64 65 2e 20 54 68 69 73 20 6c 6f 6f 70   node. This loop
36810 20 6e 61 76 69 67 61 74 65 73 20 74 68 65 20 63   navigates the c
36820 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
36830 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20   .    ** points 
36840 74 6f 20 74 68 65 20 66 69 72 73 74 20 69 6e 74  to the first int
36850 65 72 69 6f 72 20 63 65 6c 6c 20 74 68 61 74 20  erior cell that 
36860 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
36870 20 70 61 72 65 6e 74 20 6f 66 0a 20 20 20 20 2a   parent of.    *
36880 2a 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  * the next page 
36890 69 6e 20 74 68 65 20 74 72 65 65 20 74 68 61 74  in the tree that
368a0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
368b0 6e 20 76 69 73 69 74 65 64 2e 20 54 68 65 0a 20  n visited. The. 
368c0 20 20 20 2a 2a 20 70 43 75 72 2d 3e 61 69 49 64     ** pCur->aiId
368d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 76  x[pCur->iPage] v
368e0 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
368f0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
36900 70 61 72 65 6e 74 20 63 65 6c 6c 0a 20 20 20 20  parent cell.    
36910 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
36920 6f 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  or to the number
36930 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 74 68 65   of cells in the
36940 20 70 61 67 65 20 69 66 20 74 68 65 20 6e 65 78   page if the nex
36950 74 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 6f  t page.    ** to
36960 20 76 69 73 69 74 20 69 73 20 74 68 65 20 72 69   visit is the ri
36970 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 69 74 73  ght-child of its
36980 20 70 61 72 65 6e 74 2e 0a 20 20 20 20 2a 2a 0a   parent..    **.
36990 20 20 20 20 2a 2a 20 49 66 20 61 6c 6c 20 70 61      ** If all pa
369a0 67 65 73 20 69 6e 20 74 68 65 20 74 72 65 65 20  ges in the tree 
369b0 68 61 76 65 20 62 65 65 6e 20 76 69 73 69 74 65  have been visite
369c0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
369d0 5f 4f 4b 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  _OK to the.    *
369e0 2a 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 2a 2f  * caller..    */
369f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
36a00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 64 6f  leaf ){.      do
36a10 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
36a20 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
36a30 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
36a40 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 62  l pages of the b
36a50 2d 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20  -tree have been 
36a60 76 69 73 69 74 65 64 2e 20 52 65 74 75 72 6e 20  visited. Return 
36a70 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 2a 2f  successfully. */
36a80 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 45 6e  .          *pnEn
36a90 74 72 79 20 3d 20 6e 45 6e 74 72 79 3b 0a 20 20  try = nEntry;.  
36aa0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
36ac0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
36ad0 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
36ae0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
36af0 20 20 7d 77 68 69 6c 65 20 28 20 70 43 75 72 2d    }while ( pCur-
36b00 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
36b10 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
36b20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
36b30 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 20 20  nCell );..      
36b40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
36b50 2d 3e 69 50 61 67 65 5d 2b 2b 3b 0a 20 20 20 20  ->iPage]++;.    
36b60 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
36b70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
36b80 67 65 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge];.    }..    
36b90 2f 2a 20 44 65 73 63 65 6e 64 20 74 6f 20 74 68  /* Descend to th
36ba0 65 20 63 68 69 6c 64 20 6e 6f 64 65 20 6f 66 20  e child node of 
36bb0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 74 68  the cell that th
36bc0 65 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  e cursor current
36bd0 6c 79 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ly .    ** point
36be0 73 20 61 74 2e 20 54 68 69 73 20 69 73 20 74 68  s at. This is th
36bf0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 66  e right-child if
36c00 20 28 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e   (iIdx==pPage->n
36c10 43 65 6c 6c 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  Cell)..    */.  
36c20 20 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61    iIdx = pCur->a
36c30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
36c40 5d 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3d  ];.    if( iIdx=
36c50 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
36c60 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
36c70 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
36c80 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
36c90 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
36ca0 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
36cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
36cc0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
36cd0 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
36ce0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 49 64  dCell(pPage, iId
36cf0 78 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  x)));.    }.  }.
36d00 0a 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
36d10 61 73 20 6f 63 63 75 72 72 65 64 2e 20 52 65 74  as occurred. Ret
36d20 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
36d30 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  e. */.  return r
36d40 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
36d50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
36d60 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
36d70 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
36d80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
36d90 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
36da0 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
36db0 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
36dc0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
36dd0 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
36de0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
36df0 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
36e00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
36e10 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
36e20 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
36e30 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
36e40 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
36e50 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36e60 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
36e70 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
36e80 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
36e90 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
36ea0 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
36eb0 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
36ec0 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63  ap;.  if( !pChec
36ed0 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72  k->mxErr ) retur
36ee0 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45  n;.  pCheck->mxE
36ef0 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e  rr--;.  pCheck->
36f00 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61  nErr++;.  va_sta
36f10 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
36f20 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 65  .  if( pCheck->e
36f30 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a 20  rrMsg.nChar ){. 
36f40 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
36f50 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b  umAppend(&pCheck
36f60 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c 20  ->errMsg, "\n", 
36f70 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  1);.  }.  if( zM
36f80 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sg1 ){.    sqlit
36f90 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
36fa0 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67  (&pCheck->errMsg
36fb0 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20 20  , zMsg1, -1);.  
36fc0 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72 69  }.  sqlite3VXPri
36fd0 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72 72  ntf(&pCheck->err
36fe0 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74 2c  Msg, 1, zFormat,
36ff0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
37000 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b  p);.  if( pCheck
37010 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63 46  ->errMsg.mallocF
37020 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43 68  ailed ){.    pCh
37030 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  eck->mallocFaile
37040 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d = 1;.  }.}.#en
37050 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
37060 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
37070 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CK */..#ifndef S
37080 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
37090 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a  RITY_CHECK./*.**
370a0 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65   Add 1 to the re
370b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
370c0 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49  r page iPage.  I
370d0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65  f this is the se
370e0 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63  cond.** referenc
370f0 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61  e to the page, a
37100 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  dd an error mess
37110 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a  age to pCheck->z
37120 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72  ErrMsg..** Retur
37130 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65  n 1 if there are
37140 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65   2 ore more refe
37150 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
37160 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69  ge and 0 if.** i
37170 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
37180 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f  rst reference to
37190 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
371a0 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74   Also check that
371b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
371c0 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a   is in bounds..*
371d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
371e0 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43  ckRef(IntegrityC
371f0 6b 20 2a 70 43 68 65 63 6b 2c 20 50 67 6e 6f 20  k *pCheck, Pgno 
37200 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
37210 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
37220 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
37230 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
37240 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 29 7b 0a  Check->nPage ){.
37250 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
37260 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
37270 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70 61  ext, "invalid pa
37280 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20 69  ge number %d", i
37290 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
372a0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
372b0 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61  Check->anRef[iPa
372c0 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63 68  ge]==1 ){.    ch
372d0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
372e0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
372f0 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f  2nd reference to
37300 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65   page %d", iPage
37310 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
37320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20 28  .  }.  return  (
37330 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
37340 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69  age]++)>1;.}..#i
37350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37360 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
37370 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
37380 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  e entry in the p
37390 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
373a0 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73 20  age iChild maps 
373b0 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61 72  to .** page iPar
373c0 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79 70  ent, pointer typ
373d0 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e 6f  e ptrType. If no
373e0 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72 72  t, append an err
373f0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74 6f  or message.** to
37400 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74   pCheck..*/.stat
37410 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74 72  ic void checkPtr
37420 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74 79  map(.  Integrity
37430 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f 2a  Ck *pCheck,   /*
37440 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
37450 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 67   context */.  Pg
37460 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37470 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70 61       /* Child pa
37480 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75  ge number */.  u
37490 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
374a0 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65        /* Expecte
374b0 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74 79  d pointer map ty
374c0 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 61  pe */.  Pgno iPa
374d0 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 2f  rent,          /
374e0 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
374f0 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70 61  er map parent pa
37500 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  ge number */.  c
37510 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20  har *zContext   
37520 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
37530 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75 73   description (us
37540 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73 67  ed for error msg
37550 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
37560 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54 79  ;.  u8 ePtrmapTy
37570 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d  pe;.  Pgno iPtrm
37580 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63 20  apParent;..  rc 
37590 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68 65  = ptrmapGet(pChe
375a0 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64 2c  ck->pBt, iChild,
375b0 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20 26   &ePtrmapType, &
375c0 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a  iPtrmapParent);.
375d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
375e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
375f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37600 29 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63  ) pCheck->malloc
37610 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
37620 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
37630 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
37640 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61 64   "Failed to read
37650 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c   ptrmap key=%d",
37660 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65   iChild);.    re
37670 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
37680 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65 54   ePtrmapType!=eT
37690 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50 61  ype || iPtrmapPa
376a0 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29 7b  rent!=iParent ){
376b0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
376c0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
376d0 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42 61  text, .      "Ba
376e0 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79 20  d ptr map entry 
376f0 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64 3d  key=%d expected=
37700 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c  (%d,%d) got=(%d,
37710 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43 68  %d)", .      iCh
37720 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61 72  ild, eType, iPar
37730 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70 65  ent, ePtrmapType
37740 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29  , iPtrmapParent)
37750 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
37760 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
37770 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
37780 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66 20   freelist or of 
37790 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
377a0 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79   list..** Verify
377b0 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
377c0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
377d0 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73   list is N..*/.s
377e0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
377f0 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69 74  List(.  Integrit
37800 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a  yCk *pCheck,  /*
37810 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   Integrity check
37820 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
37830 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74 2c   int isFreeList,
37840 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
37850 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20 20  or a freelist.  
37860 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66 6c  False for overfl
37870 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a  ow page list */.
37880 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
37890 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
378a0 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73 74  number for first
378b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
378c0 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
378e0 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20  Expected number 
378f0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
37900 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  list */.  char *
37910 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
37920 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20 65  /* Context for e
37930 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
37940 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
37950 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e 3b  nt expected = N;
37960 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
37970 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28 20  iPage;.  while( 
37980 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65 63  N-- > 0 && pChec
37990 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20 20  k->mxErr ){.    
379a0 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61 67  DbPage *pOvflPag
379b0 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e;.    unsigned 
379c0 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b  char *pOvflData;
379d0 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 31  .    if( iPage<1
379e0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
379f0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
37a00 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
37a10 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70 61      "%d of %d pa
37a20 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d  ges missing from
37a30 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 73   overflow list s
37a40 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c 0a  tarting at %d",.
37a50 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20 65            N+1, e
37a60 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74 29  xpected, iFirst)
37a70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
37a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
37a90 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
37aa0 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29  age, zContext) )
37ab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
37ac0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
37ad0 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20  pCheck->pPager, 
37ae0 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f  (Pgno)iPage, &pO
37af0 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20 20  vflPage) ){.    
37b00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
37b10 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
37b20 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67 65  t, "failed to ge
37b30 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  t page %d", iPag
37b40 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
37b50 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c  .    }.    pOvfl
37b60 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64  Data = (unsigned
37b70 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50   char *)sqlite3P
37b80 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76 66  agerGetData(pOvf
37b90 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  lPage);.    if( 
37ba0 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20 20  isFreeList ){.  
37bb0 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74 34      int n = get4
37bc0 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
37bd0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
37be0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
37bf0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 43  UUM.      if( pC
37c00 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
37c10 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
37c20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
37c30 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  eck, iPage, PTRM
37c40 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
37c50 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
37c60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
37c70 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42  if( n>pCheck->pB
37c80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  t->usableSize/4-
37c90 32 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  2 ){.        che
37ca0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
37cb0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
37cc0 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c 69           "freeli
37cd0 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f  st leaf count to
37ce0 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25 64  o big on page %d
37cf0 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
37d00 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65     N--;.      }e
37d10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
37d20 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
37d30 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
37d40 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74 34  iFreePage = get4
37d50 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61 5b  byte(&pOvflData[
37d60 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66  8+i*4]);.#ifndef
37d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37d80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
37d90 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42    if( pCheck->pB
37da0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
37db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 65  .            che
37dc0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
37dd0 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52 4d   iFreePage, PTRM
37de0 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
37df0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
37e00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
37e10 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65 66          checkRef
37e20 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61  (pCheck, iFreePa
37e30 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  ge, zContext);. 
37e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37e50 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d   N -= n;.      }
37e60 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
37e70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37e80 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a  ACUUM.    else{.
37e90 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
37ea0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
37eb0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  ts auto-vacuum a
37ec0 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74 20  nd iPage is not 
37ed0 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a  the last.      *
37ee0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 6f  * page in this o
37ef0 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68  verflow list, ch
37f00 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f 69  eck that the poi
37f10 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
37f20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  or.      ** the 
37f30 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d  following page m
37f40 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20 20  atches iPage..  
37f50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
37f60 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75   pCheck->pBt->au
37f70 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30 20  toVacuum && N>0 
37f80 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 67  ){.        i = g
37f90 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
37fa0 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65 63  a);.        chec
37fb0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
37fc0 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  i, PTRMAP_OVERFL
37fd0 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW2, iPage, zCon
37fe0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  text);.      }. 
37ff0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
38000 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
38010 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20  (pOvflData);.   
38020 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
38030 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ef(pOvflPage);. 
38040 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
38050 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
38060 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
38070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38080 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
38090 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69  CK./*.** Do vari
380a0 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ous sanity check
380b0 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70 61  s on a single pa
380c0 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20 52  ge of a tree.  R
380d0 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65  eturn.** the tre
380e0 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20 70  e depth.  Root p
380f0 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20 20  ages return 0.  
38100 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20  Parents of root 
38110 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20  pages.** return 
38120 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  1, and so forth.
38130 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63 68  .** .** These ch
38140 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a  ecks are done:.*
38150 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d 61  *.**      1.  Ma
38160 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65 6c  ke sure that cel
38170 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b  ls and freeblock
38180 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70  s do not overlap
38190 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75 74  .**          but
381a0 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70   combine to comp
381b0 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68 65  letely cover the
381c0 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32   page..**  NO  2
381d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65 6c  .  Make sure cel
381e0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f 72  l keys are in or
381f0 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20  der..**  NO  3. 
38200 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
38210 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  y is less than o
38220 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65  r equal to zLowe
38230 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20  rBound..**  NO  
38240 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f  4.  Make sure no
38250 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72 20   key is greater 
38260 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
38270 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zUpperBound..**
38280 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b 20        5.  Check 
38290 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
382a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
382b0 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65 63  .**      6.  Rec
382c0 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63 68  ursively call ch
382d0 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20 61  eckTreePage on a
382e0 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20  ll children..** 
382f0 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79 20       7.  Verify 
38300 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20 6f  that the depth o
38310 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69  f all children i
38320 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20  s the same..**  
38330 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75 72      8.  Make sur
38340 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20 61  e this page is a
38350 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c 6c  t least 33% full
38360 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a 2a   or else it is.*
38370 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72  *          the r
38380 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
38390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
383a0 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20 20  heckTreePage(.  
383b0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
383c0 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74  eck,  /* Context
383d0 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79 20   for the sanity 
383e0 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69  check */.  int i
383f0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
38400 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
38410 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 63  of the page to c
38420 68 65 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  heck */.  char *
38430 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
38440 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
38450 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
38460 65 20 2a 70