/ Hex Artifact Content
Login

Artifact 46f24d0b659583bae13b7f22534e5f529ebc0684:


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 37 30 33 20 32 30 30 39 2f 30  c,v 1.703 2009/0
0190: 37 2f 32 34 20 31 39 3a 30 31 3a 31 39 20 64 72  7/24 19:01:19 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 31 3b 20 20 2f 2a 20 54 72  eTrace=1;  /* 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 0a 23 69 66 64 65 66 20 53 51 4c  if....#ifdef SQL
07c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
07d0: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
07e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
07f0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0800: 62 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68  bleLock(), setSh
0810: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0820: 63 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63  ck(),.  ** and c
0830: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0840: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20  heTableLocks(). 
0850: 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65   ** manipulate e
0860: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74  ntries in the Bt
0870: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e  Shared.pLock lin
0880: 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f  ked list used to
0890: 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72   store.  ** shar
08a0: 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c  ed-cache table l
08b0: 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74  evel locks. If t
08c0: 68 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f  he library is co
08d0: 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a  mpiled with the.
08e0: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
08f0: 65 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c  e feature disabl
0900: 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  ed, then there i
0910: 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20  s only ever one 
0920: 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63  user.  ** of eac
0930: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  h BtShared struc
0940: 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73  ture and so this
0950: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20   locking is not 
0960: 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a  necessary. .  **
0970: 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c   So define the l
0980: 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63  ock related func
0990: 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e  tions as no-ops.
09a0: 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  .  */.  #define 
09b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
09c0: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29  TableLock(a,b,c)
09d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
09e0: 66 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61  fine setSharedCa
09f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  cheTableLock(a,b
0a00: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
0a10: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c  #define clearAll
0a20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a30: 4c 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69  Locks(a).  #defi
0a40: 6e 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  ne downgradeAllS
0a50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0a60: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0a70: 65 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  e hasSharedCache
0a80: 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c  TableLock(a,b,c,
0a90: 64 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68  d) 1.  #define h
0aa0: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
0ab0: 61 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a  a, b) 0.#endif..
0ac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
0ad0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0ae0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
0af0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
0b00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0b10: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0b20: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0b30: 61 74 65 6d 65 6e 74 2e 20 49 74 20 63 68 65 63  atement. It chec
0b40: 6b 73 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 6e 65  ks.** that conne
0b50: 63 74 69 6f 6e 20 70 20 68 6f 6c 64 73 20 74 68  ction p holds th
0b60: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
0b70: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
0b80: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 62 2d 74  e to the .** b-t
0b90: 72 65 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61  ree with root pa
0ba0: 67 65 20 69 52 6f 6f 74 2e 20 49 66 20 73 6f 2c  ge iRoot. If so,
0bb0: 20 74 72 75 65 20 69 73 20 72 65 74 75 72 6e 65   true is returne
0bc0: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 66 61  d. Otherwise, fa
0bd0: 6c 73 65 2e 20 0a 2a 2a 20 46 6f 72 20 65 78 61  lse. .** For exa
0be0: 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69 74 69  mple, when writi
0bf0: 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 2d  ng to a table b-
0c00: 74 72 65 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  tree with root-p
0c10: 61 67 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a  age iRoot via .*
0c20: 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69  * Btree connecti
0c30: 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a  on pBtree:.**.**
0c40: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 53      assert( hasS
0c50: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0c60: 6f 63 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  ock(pBtree, iRoo
0c70: 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b  t, 0, WRITE_LOCK
0c80: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ) );.**.** When 
0c90: 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  writing to an in
0ca0: 64 65 78 20 62 2d 74 72 65 65 20 74 68 61 74 20  dex b-tree that 
0cb0: 72 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61  resides in a sha
0cc0: 72 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20  rable database, 
0cd0: 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  the .** caller s
0ce0: 68 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74  hould have first
0cf0: 20 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b   obtained a lock
0d00: 20 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20   specifying the 
0d10: 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
0d20: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
0d30: 67 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  g table b-tree. 
0d40: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d50: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d60: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d70: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d80: 74 73 20 65 61 63 68 20 62 2d 74 72 65 65 20 61  ts each b-tree a
0d90: 73 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72  s a separate str
0da0: 75 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72  ucture. To deter
0db0: 6d 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c  mine.** the tabl
0dc0: 65 20 62 2d 74 72 65 65 20 63 6f 72 72 65 73 70  e b-tree corresp
0dd0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
0de0: 64 65 78 20 62 2d 74 72 65 65 20 62 65 69 6e 67  dex b-tree being
0df0: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
0e00: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
0e10: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
0e20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
0e30: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
0e40: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
0e50: 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
0e60: 65 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74  ed at page iRoot
0e70: 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79  , the caller may
0e80: 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65  .** hold a write
0e90: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
0ea0: 65 6d 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20  ema table (root 
0eb0: 70 61 67 65 20 31 29 2e 20 54 68 69 73 20 69 73  page 1). This is
0ec0: 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61   also.** accepta
0ed0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
0ee0: 6e 74 20 68 61 73 53 68 61 72 65 64 43 61 63 68  nt hasSharedCach
0ef0: 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74  eTableLock(.  Bt
0f00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
0f10: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
0f20: 68 61 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f  hat must hold lo
0f30: 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ck */.  Pgno iRo
0f40: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot,            /
0f50: 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62  * Root page of b
0f60: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
0f70: 73 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  sIndex,         
0f80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f    /* True if iRo
0f90: 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f  ot is the root o
0fa0: 66 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  f an index b-tre
0fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b  e */.  int eLock
0fc0: 54 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Type          /*
0fd0: 20 52 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74   Required lock t
0fe0: 79 70 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  ype (READ_LOCK o
0ff0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f  r WRITE_LOCK) */
1000: 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53  .){.  Schema *pS
1010: 63 68 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20  chema = (Schema 
1020: 2a 29 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  *)pBtree->pBt->p
1030: 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69  Schema;.  Pgno i
1040: 54 61 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  Tab = 0;.  BtLoc
1050: 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20  k *pLock;..  /* 
1060: 49 66 20 74 68 69 73 20 62 2d 74 72 65 65 20 64  If this b-tree d
1070: 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73  atabase is not s
1080: 68 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20  hareable, or if 
1090: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
10a0: 61 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68  ading.  ** and h
10b0: 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  as the read-unco
10c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
10d0: 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69  , then no lock i
10e0: 73 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a  s required. .  *
10f0: 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  * In these cases
1100: 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   return true imm
1110: 65 64 69 61 74 65 6c 79 2e 20 20 49 66 20 74 68  ediately.  If th
1120: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1130: 69 6e 67 20 0a 20 20 2a 2a 20 6f 72 20 77 72 69  ing .  ** or wri
1140: 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d  ting an index b-
1150: 74 72 65 65 2c 20 62 75 74 20 74 68 65 20 73 63  tree, but the sc
1160: 68 65 6d 61 20 69 73 20 6e 6f 74 20 6c 6f 61 64  hema is not load
1170: 65 64 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 0a  ed, then return.
1180: 20 20 2a 2a 20 74 72 75 65 20 61 6c 73 6f 2e 20    ** true also. 
1190: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11a0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
11b0: 64 2c 20 62 75 74 20 69 74 20 69 73 20 74 6f 6f  d, but it is too
11c0: 20 64 69 66 66 69 63 75 6c 74 0a 20 20 2a 2a 20   difficult.  ** 
11d0: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
11e0: 63 6c 69 65 6e 74 20 61 63 74 75 61 6c 6c 79 20  client actually 
11f0: 68 6f 6c 64 73 20 69 74 2e 20 54 68 69 73 20 64  holds it. This d
1200: 6f 65 73 6e 27 74 20 68 61 70 70 65 6e 20 76 65  oesn't happen ve
1210: 72 79 0a 20 20 2a 2a 20 6f 66 74 65 6e 2e 20 20  ry.  ** often.  
1220: 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65 65  */.  if( (pBtree
1230: 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a 20  ->sharable==0). 
1240: 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65 3d    || (eLockType=
1250: 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28 70  =READ_LOCK && (p
1260: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1270: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1280: 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20 20 20 7c  committed)).   |
1290: 7c 20 28 69 73 49 6e 64 65 78 20 26 26 20 28 21  | (isIndex && (!
12a0: 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68  pSchema || (pSch
12b0: 65 6d 61 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63  ema->flags&DB_Sc
12c0: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 20 29  hemaLoaded)==0 )
12d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
12e0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
12f0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1300: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1310: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
1320: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
1330: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
1340: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
1350: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1360: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
1370: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1380: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1390: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
13a0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
13b0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
13c0: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
13d0: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
13e0: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
13f0: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1400: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1410: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
1420: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
1430: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
1440: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
1450: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
1460: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
1470: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 52  ( pIdx->tnum==iR
1480: 6f 6f 74 20 29 7b 0a 09 69 54 61 62 20 3d 20 70  oot ){..iTab = p
1490: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
14a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
14b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
14c0: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
14d0: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
14e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
14f0: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
1500: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
1510: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
1520: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
1530: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
1540: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
1550: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1560: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1570: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1580: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1590: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
15a0: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
15b0: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
15c0: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
15d0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
15e0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
15f0: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1600: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1610: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1620: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1630: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1640: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1650: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1660: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1670: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1680: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1690: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
16a0: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
16b0: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
16c0: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
16d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
16e0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  s function is al
16f0: 73 6f 20 75 73 65 64 20 61 73 20 70 61 72 74 20  so used as part 
1700: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
1710: 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 49 74 20  ements only. It 
1720: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65  .** returns true
1730: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 20   if there exist 
1740: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  one or more curs
1750: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
1760: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
1770: 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 20 74  oot page iRoot t
1780: 68 61 74 20 64 6f 20 6e 6f 74 20 62 65 6c 6f 6e  hat do not belon
1790: 67 20 74 6f 20 65 69 74 68 65 72 20 63 6f 6e 6e  g to either conn
17a0: 65 63 74 69 6f 6e 20 70 42 74 72 65 65 20 0a 2a  ection pBtree .*
17b0: 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
17c0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
17d0: 68 61 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63  has the read-unc
17e0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
17f0: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  t..**.** For exa
1800: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1810: 74 69 6e 67 20 74 6f 20 70 61 67 65 20 69 52 6f  ting to page iRo
1820: 6f 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ot:.**.**    ass
1830: 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
1840: 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20 69  flicts(pBtree, i
1850: 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74  Root) );.*/.stat
1860: 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f  ic int hasReadCo
1870: 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70  nflicts(Btree *p
1880: 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f  Btree, Pgno iRoo
1890: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  p;.  for(p=pBtre
18b0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18c0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
18e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20  Root==iRoot .   
18f0: 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d    && p->pBtree!=
1900: 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20 30  pBtree.     && 0
1910: 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62  ==(p->pBtree->db
1920: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1930: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
1940: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1950: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1960: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1970: 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69  .#endif    /* #i
1980: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1990: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  G */../*.** Quer
19a0: 79 20 74 6f 20 73 65 65 20 69 66 20 62 74 72 65  y to see if btre
19b0: 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f  e handle p may o
19c0: 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19d0: 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28  type eLock .** (
19e0: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
19f0: 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20  TE_LOCK) on the 
1a00: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1a10: 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75 72  page iTab. Retur
1a20: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  n.** SQLITE_OK i
1a30: 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62  f the lock may b
1a40: 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63  e obtained (by c
1a50: 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61  alling.** setSha
1a60: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a70: 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f  k()), or SQLITE_
1a80: 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a  LOCKED if not..*
1a90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65  /.static int que
1aa0: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ab0: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
1ac0: 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65   Pgno iTab, u8 e
1ad0: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
1ae0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1af0: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72  .  BtLock *pIter
1b00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1b10: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1b20: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1b30: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1b40: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  LOCK || eLock==W
1b50: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RITE_LOCK );.  a
1b60: 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20  ssert( p->db!=0 
1b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28 70  );.  assert( !(p
1b80: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
1b90: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1ba0: 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  ed)||eLock==WRIT
1bb0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
1bc0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
1bd0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
1be0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
1bf0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
1c00: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
1c10: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1c20: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
1c30: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
1c40: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
1c50: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
1c60: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
1c70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1c80: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
1c90: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1ca0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1cb0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
1cc0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
1cd0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
1ce0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
1cf0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
1d00: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1d10: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d20: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
1d30: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
1d40: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
1d50: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
1d60: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
1d70: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
1d80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
1da0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1db0: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
1dc0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
1dd0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
1de0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
1df0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
1e00: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
1e10: 69 74 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e  iter!=p && pBt->
1e20: 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
1e30: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1e40: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1e50: 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d  b, pBt->pWriter-
1e60: 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >db);.    return
1e70: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1e80: 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a  HAREDCACHE;.  }.
1e90: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1ea0: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1eb0: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1ec0: 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  xt){.    /* The 
1ed0: 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72  condition (pIter
1ee0: 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20  ->eLock!=eLock) 
1ef0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1f00: 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a   if(...) .    **
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20   statement is a 
1f20: 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f  simplification o
1f30: 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
1f40: 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45     (eLock==WRITE
1f50: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
1f60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f70: 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  K).    **.    **
1f80: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
1f90: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
1fa0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
1fb0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
1fc0: 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f  on.    ** may ho
1fd0: 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20  ld a WRITE_LOCK 
1fe0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20  on any table in 
1ff0: 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65  this file (since
2000: 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a   there can.    *
2010: 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67  * only be a sing
2020: 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20  le writer)..    
2030: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2040: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2050: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d  D_LOCK || pIter-
2060: 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  >eLock==WRITE_LO
2070: 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
2080: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2090: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74  CK || pIter->pBt
20a0: 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d  ree==p || pIter-
20b0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
20c0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  K);.    if( pIte
20d0: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20  r->pBtree!=p && 
20e0: 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pIter->iTable==i
20f0: 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c  Tab && pIter->eL
2100: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock!=eLock ){.  
2110: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
2120: 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
2130: 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65  db, pIter->pBtre
2140: 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  e->db);.      if
2150: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2160: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  OCK ){.        a
2170: 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70  ssert( p==pBt->p
2180: 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
2190: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
21a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21c0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
21d0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
21e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21f0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2200: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2210: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2220: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2230: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2240: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2250: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2260: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2270: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
2280: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
2290: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
22a0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
22b0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
22c0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
22d0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
22e0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22f0: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2300: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2310: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2320: 65 64 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  ed b-tree connec
2330: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 69 73 20 63  tion handle is c
2340: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68  onnected to a sh
2350: 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20  arable.**       
2360: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
2370: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
2380: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 29  Shared.sharable)
2390: 20 66 6c 61 67 20 73 65 74 2c 20 61 6e 64 0a 2a   flag set, and.*
23a0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
23b0: 68 65 72 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  her b-tree conne
23c0: 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 68 6f 6c  ction handle hol
23d0: 64 73 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ds a lock that c
23e0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
23f0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
2400: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
2410: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2420: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2430: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2440: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2450: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2460: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2470: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2480: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2490: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
24a0: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
24b0: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
24c0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
24d0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
24f0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2500: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
2510: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
2520: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2530: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2540: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2550: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2560: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2570: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2580: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2590: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
25b0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
25c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
25d0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
25e0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
25f0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
2600: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
2610: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
2620: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2630: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2640: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2650: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2660: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2680: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2690: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
26a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
26b0: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
26c0: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
26d0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
26e0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
26f0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2700: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2710: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2720: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2730: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2750: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2760: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2770: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2780: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2790: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
27a0: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
27b0: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
27c0: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
27d0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
27e0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
27f0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2820: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2830: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2840: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2850: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2860: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2870: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2880: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2890: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
28a0: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
28b0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
28c0: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
28d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
28e0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
28f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2900: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2910: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2920: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2930: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2940: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2950: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2960: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2970: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2980: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2990: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
29a0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
29b0: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
29c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
29d0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
29e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
29f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a00: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2a10: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2a20: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2a30: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2a40: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2a50: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2a60: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2a70: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2a80: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2a90: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2aa0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2ab0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2ac0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ad0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2ae0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2af0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2b00: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2b10: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2b20: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2b30: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2b40: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2b50: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2b60: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2b70: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2b80: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2b90: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2ba0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2bb0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2bd0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2be0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2bf0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2c00: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2c10: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2c20: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
2c30: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
2c40: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
2c50: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
2c60: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2c70: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
2c80: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
2c90: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20  handle p..**.** 
2ca0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2cb0: 73 75 6d 65 73 20 74 68 61 74 20 68 61 6e 64 6c  sumes that handl
2cc0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2cd0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2ce0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2cf0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2d00: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2d10: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2d20: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2d30: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2d40: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2d50: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2d60: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2d70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2d80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2d90: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2da0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2db0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2dd0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2de0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2df0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2e00: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2e10: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2e20: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2e30: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2e40: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2e50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2e60: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2e70: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2e80: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2e90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ea0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2eb0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2ec0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ed0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
2ee0: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
2ef0: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
2f00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f10: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
2f20: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
2f30: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
2f40: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
2f50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2f60: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
2f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2f80: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
2f90: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
2fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
2fb0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
2fc0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
2fd0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
2fe0: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
2ff0: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3000: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3010: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3020: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3030: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3040: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3050: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3060: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3070: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3080: 77 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  when connection 
3090: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
30a0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
30b0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
30c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
30d0: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
30e0: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
30f0: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3100: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3110: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3120: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3130: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3140: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
3150: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
3160: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
3170: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
3180: 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61  he isPending fla
3190: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
31a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
31b0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
31c0: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
31d0: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
31e0: 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  g must.    ** be
31f0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
3200: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
3210: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
3220: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
3230: 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  /.    pBt->isPen
3240: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ding = 0;.  }.}.
3250: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3260: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3270: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3280: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
3290: 70 20 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  p to read-locks.
32a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32b0: 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
32c0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
32d0: 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  s(Btree *p){.  B
32e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32f0: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74  ->pBt;.  if( pBt
3300: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3310: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3320: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  k;.    pBt->pWri
3330: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3340: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
3350: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65  0;.    pBt->isPe
3360: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66  nding = 0;.    f
3370: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c  or(pLock=pBt->pL
3380: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
3390: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
33a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Lock->eLock==REA
33c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d  D_LOCK || pLock-
33d0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20  >pBtree==p );.  
33e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
33f0: 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
3400: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69    }.  }.}..#endi
3410: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3420: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3430: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  ..static void re
3440: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
3450: 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46  e *pPage);  /* F
3460: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3470: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66   */../*.** Verif
3480: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3490: 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65 78 20  r holds a mutex 
34a0: 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 0a  on the BtShared.
34b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
34c0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
34d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
34e0: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
34f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3500: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3510: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3520: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3530: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3540: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3550: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3560: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3570: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3580: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3590: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
35a0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
35b0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
35c0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35d0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
35f0: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3600: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3610: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3620: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3630: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3640: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3650: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3660: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3670: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3680: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3690: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
36a0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
36b0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
36c0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
36d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
36e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
36f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3700: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3710: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3720: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3730: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3740: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3750: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3760: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3770: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3780: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3790: 65 0a 2a 2a 20 62 2d 74 72 65 65 20 74 6f 20 69  e.** b-tree to i
37a0: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
37b0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
37c0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
37d0: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
37e0: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
37f0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 41 72  ing modified. Ar
3800: 67 75 6d 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20  gument pgnoRoot 
3810: 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d  is the .** root-
3820: 70 61 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c  page of the tabl
3830: 65 20 62 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a  e b-tree. .**.**
3840: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3850: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3860: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3870: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3880: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3890: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
38a0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
38b0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
38c0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
38d0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
38e0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
38f0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3900: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3910: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3920: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3930: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3940: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3950: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3960: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3970: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3980: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3990: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
39a0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
39b0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
39c0: 68 69 73 20 73 70 65 63 69 66 69 63 20 72 6f 77  his specific row
39d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
39e0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
39f0: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
3a00: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
3a10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
3a20: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
3a30: 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
3a40: 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
3a50: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61   /* Look for rea
3a60: 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69  d cursors on thi
3a70: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 36 34  s btree */.  i64
3a80: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3a90: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3aa0: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3ab0: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3ac0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ae0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3af0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3b00: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3b10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3b20: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3b30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b40: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3b50: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3b60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3b70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3b80: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3b90: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3ba0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3bb0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3bc0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3bd0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3be0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3bf0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3c00: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3c10: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3c20: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3c30: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3c40: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3c50: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3c60: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
3c70: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
3c80: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
3c90: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
3ca0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
3cb0: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
3cc0: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
3cd0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
3ce0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
3cf0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
3d00: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
3d10: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
3d20: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
3d30: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
3d40: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
3d50: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
3d60: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
3d70: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
3d80: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
3d90: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
3da0: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
3db0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3dc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
3dd0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
3de0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
3df0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
3e00: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
3e10: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
3e20: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
3e30: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
3e40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
3e50: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
3e60: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
3e70: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
3e80: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
3e90: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
3ea0: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
3eb0: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
3ec0: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
3ed0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
3ee0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
3ef0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
3f00: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
3f10: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
3f20: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
3f30: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
3f40: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
3f50: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
3f60: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
3f70: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
3f80: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
3f90: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
3fa0: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
3fb0: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
3fc0: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
3fd0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
3fe0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
3ff0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4000: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4010: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4020: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4030: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4040: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4050: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4060: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4070: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4080: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4090: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
40a0: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
40b0: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
40c0: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
40d0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
40e0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
40f0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4100: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4110: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4120: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4130: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4140: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4150: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4160: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4170: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4180: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4190: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
41a0: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
41b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
41c0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
41d0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
41e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
41f0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4200: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4210: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4220: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4230: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4240: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4250: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4260: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4270: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4280: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4290: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
42a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
42b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
42c0: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
42d0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74   above is ommitt
42e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
42f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4300: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4310: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4320: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4330: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4340: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4350: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4360: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4370: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4380: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4390: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
43a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
43b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
43c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
43d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
43e0: 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 31     int nPage = 1
43f0: 30 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  00;.    sqlite3P
4400: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
4410: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
4420: 65 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71  e);.    /* If sq
4430: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
4440: 75 6e 74 28 29 20 66 61 69 6c 73 20 74 68 65 72  unt() fails ther
4450: 65 20 69 73 20 6e 6f 20 68 61 72 6d 20 62 65 63  e is no harm bec
4460: 61 75 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  ause the.    ** 
4470: 6e 50 61 67 65 20 76 61 72 69 61 62 6c 65 20 69  nPage variable i
4480: 73 20 75 6e 63 68 61 6e 67 65 64 20 66 72 6f 6d  s unchanged from
4490: 20 69 74 73 20 64 65 66 61 75 6c 74 20 76 61 6c   its default val
44a0: 75 65 20 6f 66 20 31 30 30 20 2a 2f 0a 20 20 20  ue of 100 */.   
44b0: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
44c0: 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  t = sqlite3Bitve
44d0: 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50 61  cCreate((u32)nPa
44e0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42  ge);.    if( !pB
44f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
4500: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4510: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
4520: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4530: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f  QLITE_OK && pgno
4540: 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  <=sqlite3BitvecS
4550: 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ize(pBt->pHasCon
4560: 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20  tent) ){.    rc 
4570: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
4580: 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  et(pBt->pHasCont
4590: 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent, pgno);.  }.
45a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
45b0: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20  /*.** Query the 
45c0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
45d0: 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a  tent vector..**.
45e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4610: 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64   page is removed
4620: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65   from the.** fre
4630: 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65  e-list for reuse
4640: 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c  . It returns fal
4650: 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  se if it is safe
4660: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
4670: 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68  .** page from th
4680: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  e pager layer wi
4690: 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
46a0: 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72  nt' flag set. Tr
46b0: 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ue otherwise..*/
46c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
46d0: 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eGetHasContent(B
46e0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
46f0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76  no pgno){.  Bitv
4700: 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61  ec *p = pBt->pHa
4710: 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75  sContent;.  retu
4720: 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73  rn (p && (pgno>s
4730: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
4740: 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  (p) || sqlite3Bi
4750: 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f  tvecTest(p, pgno
4760: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  )));.}../*.** Cl
4770: 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68  ear (destroy) th
4780: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4790: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
47a0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  his should be.**
47b0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
47c0: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61  conclusion of ea
47d0: 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ch write-transac
47e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
47f0: 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48  void btreeClearH
4800: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4810: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
4820: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
4830: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4840: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43  t);.  pBt->pHasC
4850: 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ontent = 0;.}../
4860: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4870: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4880: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4890: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
48a0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
48b0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
48c0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
48d0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
48e0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
48f0: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4900: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4910: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4920: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4930: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4940: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4950: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4960: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4970: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4980: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4990: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
49a0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
49b0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
49c0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
49d0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
49e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
49f0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4a00: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
4a10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
4a20: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
4a30: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
4a40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
4a50: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
4a60: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
4a70: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
4a80: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
4a90: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
4aa0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
4ab0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
4ac0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
4ad0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
4ae0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
4af0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
4b00: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
4b10: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
4b20: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
4b30: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
4b40: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
4b50: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
4b60: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
4b70: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
4b80: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
4b90: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
4ba0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
4bb0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
4bc0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
4bd0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4be0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
4bf0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
4c00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4c10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
4c20: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
4c30: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
4c40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4c50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4c60: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
4c70: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
4c80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4c90: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
4ca0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4cb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4cc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4cd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
4ce0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4cf0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
4d00: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
4d10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4d20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4d30: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
4d40: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
4d50: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
4d60: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
4d70: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
4d80: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4d90: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
4da0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
4db0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4dc0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
4dd0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
4de0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4df0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
4e00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
4e10: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
4e20: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
4e30: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
4e40: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
4e50: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
4e60: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
4e70: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
4e80: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
4e90: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
4ea0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
4eb0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
4ec0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
4ed0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
4ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
4ef0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
4f00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
4f10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
4f20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
4f30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
4f40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4f50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
4f60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4f70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
4f80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
4f90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
4fa0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
4fb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4fc0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
4fd0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
4fe0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
4ff0: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
5000: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
5010: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
5020: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
5030: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
5040: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5050: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
5060: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
5070: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5080: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5090: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
50a0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
50b0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
50c0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
50d0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
50e0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
50f0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5100: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5110: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5120: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5130: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5140: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5150: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5160: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5170: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5180: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5190: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
51a0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
51b0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
51c0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
51d0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
51e0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
51f0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
5200: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
5210: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
5220: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
5230: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
5240: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5250: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
5260: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
5270: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
5280: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
5290: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
52a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
52b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
52c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
52d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
52e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
52f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
5300: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
5310: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
5320: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
5330: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
5340: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
5350: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
5360: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
5370: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
5380: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
53b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
53c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
53d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
53e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
53f0: 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20  aSpace[150];    
5400: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
5410: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
5420: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
5430: 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b  loc */..  if( pK
5440: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5450: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5460: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5470: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5480: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5490: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
54a0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
54b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
54e0: 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
54f0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
5500: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5510: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
5520: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5530: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
5540: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
5550: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
5560: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
5570: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
5580: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
5590: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
55a0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
55b0: 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
55c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
55d0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
55e0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
55f0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
5600: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
5610: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
5620: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
5630: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
5640: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
5650: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
5660: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
5670: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
5680: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
5690: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
56a0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
56b0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
56c0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
56d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
56e0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
56f0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
5700: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tion()..*/.stati
5710: 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f  c int btreeResto
5720: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5730: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5740: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
5750: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5760: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5770: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5780: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5790: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
57a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
57b0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
57c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
57d0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
57e0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
57f0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5800: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
5810: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
5820: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
5830: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
5840: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
5850: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5860: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5870: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
5880: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
58a0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
58b0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
58c0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
58d0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
58e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
58f0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5900: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5910: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5920: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5930: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5940: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5950: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5960: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5970: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5980: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5990: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
59a0: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
59b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
59c0: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
59d0: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
59e0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
59f0: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
5a00: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
5a10: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
5a20: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
5a30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
5a40: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
5a50: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
5a60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
5a70: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
5a80: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
5a90: 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75  to one if the cu
5aa0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61  rsor has moved a
5ab0: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  nd 0 if not..*/.
5ac0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
5ad0: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42  CursorHasMoved(B
5ae0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
5af0: 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a  nt *pHasMoved){.
5b00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
5b10: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
5b20: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
5b30: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
5b40: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
5b50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5b60: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
5b70: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
5b80: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70  ID || pCur->skip
5b90: 4e 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a  Next!=0 ){.    *
5ba0: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
5bb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61   }else{.    *pHa
5bc0: 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  sMoved = 0;.  }.
5bd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5be0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
5bf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5c00: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
5c10: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
5c20: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
5c30: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
5c40: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
5c50: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
5c60: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
5c70: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
5c80: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
5c90: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
5ca0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
5cb0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
5cc0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5cd0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
5ce0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
5cf0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
5d00: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
5d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5d30: 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  ) );.  nPagesPer
5d40: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
5d50: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
5d60: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
5d70: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
5d80: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
5d90: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
5da0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
5db0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
5dc0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5dd0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
5de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
5df0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
5e00: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
5e10: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
5e20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5e30: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
5e40: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5e50: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
5e60: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
5e70: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
5e80: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
5e90: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
5ea0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
5eb0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
5ec0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
5ed0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
5ee0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
5ef0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
5f00: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5f10: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
5f20: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
5f30: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
5f40: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
5f50: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
5f60: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5f70: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
5f80: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
5f90: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
5fa0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
5fb0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5fc0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
5fd0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
5fe0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
5ff0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6000: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6010: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6020: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6030: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6040: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6050: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6060: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6070: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6080: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6090: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
60a0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
60b0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
60c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
60d0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
60e0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
60f0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6100: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6110: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6120: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6130: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6140: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6150: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6160: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6170: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6180: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6190: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
61a0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
61b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
61c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
61d0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
61e0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
61f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6200: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6210: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6220: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6240: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6250: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6260: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6270: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6280: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6290: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
62a0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
62b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
62c0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
62d0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
62e0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
62f0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6300: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6310: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6320: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6330: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6340: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6350: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6360: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6370: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6380: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
6390: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
63a0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
63b0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
63c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
63d0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
63e0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
63f0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6400: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6410: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6420: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6430: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6440: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6460: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6470: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6480: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6490: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
64a0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
64b0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
64c0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
64d0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
64e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
64f0: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6500: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6510: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6520: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6530: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6540: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6550: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6560: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6570: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6580: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
6590: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
65a0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
65b0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
65c0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
65d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
65e0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
65f0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6600: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6610: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6620: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6630: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6640: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6650: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6660: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6670: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6680: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6690: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
66a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
66b0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
66c0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
66d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
66e0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
66f0: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6700: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6710: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6720: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6730: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6740: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6750: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6760: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6770: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6780: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6790: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
67a0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
67b0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
67c0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
67d0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
67e0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
67f0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6800: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6810: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6820: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6830: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6840: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6850: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6860: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6870: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6880: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6890: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
68a0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
68b0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
68c0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
68d0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
68e0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
68f0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6900: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6910: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6920: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6930: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6940: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6950: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6960: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6970: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6980: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6990: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
69a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
69b0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
69c0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
69d0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
69e0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
69f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6a00: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6a10: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6a20: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6a30: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6a40: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6a50: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6a60: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6a70: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6a80: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6a90: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6aa0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6ab0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6ac0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6ad0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6ae0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6af0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6b00: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6b10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6b20: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6b30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6b40: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6b50: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6b60: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6b70: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6b80: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6b90: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6ba0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6bb0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6bc0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6bd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6be0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6bf0: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6c00: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6c10: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6c20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6c30: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6c40: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6c50: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6c60: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6c70: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6c80: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6c90: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6ca0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6cb0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6cc0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6cd0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ce0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
6cf0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
6d00: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
6d10: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
6d20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
6d30: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
6d40: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
6d50: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
6d60: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
6d70: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
6d80: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
6d90: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
6da0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
6db0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
6dc0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
6dd0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
6de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6df0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
6e00: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
6e10: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
6e20: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
6e30: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
6e40: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
6e50: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6e60: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
6e70: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
6e80: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
6e90: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
6ea0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
6eb0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
6ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6ed0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
6ee0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
6ef0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
6f00: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
6f10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
6f20: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
6f30: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
6f40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6f50: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6f60: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
6f70: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
6f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6f90: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
6fa0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
6fb0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
6fc0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
6fd0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
6fe0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
6ff0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7000: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7010: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7020: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7030: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7040: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7050: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7060: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7070: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7080: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
7090: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
70a0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
70b0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
70d0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
70e0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
70f0: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7100: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7110: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7120: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7130: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7140: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7150: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7160: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7170: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7180: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7190: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
71a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
71b0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
71c0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
71d0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
71e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
71f0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7200: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7210: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7220: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7230: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7240: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7250: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
7260: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
7270: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
7280: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
7290: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
72a0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
72b0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
72c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
72d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
72e0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
72f0: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
7300: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
7310: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
7320: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
7330: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7340: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
7350: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
7360: 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  )nSize;.  }else{
7370: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7380: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
7390: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
73a0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
73b0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
73c0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
73d0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
73e0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
73f0: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7400: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7410: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7420: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7430: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7440: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7450: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7460: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7470: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7480: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
7490: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
74a0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
74b0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
74c0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
74d0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
74e0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
74f0: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7500: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7510: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7520: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7530: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7550: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7560: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7570: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7580: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
7590: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
75a0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
75b0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
75c0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
75d0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
75e0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
75f0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7600: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7610: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
7620: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7630: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
7640: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
7650: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
7660: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
7670: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7680: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
7690: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
76a0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
76b0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
76c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
76d0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
76e0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
76f0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7700: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7710: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
7720: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
7730: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
7740: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
7750: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7760: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7770: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7780: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7790: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
77a0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
77b0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
77c0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
77d0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
77e0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
77f0: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7800: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7810: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7820: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7830: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7840: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7850: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7860: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7870: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7880: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7890: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
78a0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
78b0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
78c0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
78d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
78e0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
78f0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7900: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7910: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7920: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7930: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7940: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7950: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7960: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7970: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7980: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7990: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
79a0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
79b0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
79c0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
79d0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
79e0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
79f0: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7a00: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7a10: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7a20: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7a30: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7a40: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7a50: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7a60: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7a70: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7a80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7a90: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7aa0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7ab0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7ac0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7ad0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7ae0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7af0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7b00: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7b10: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7b20: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7b30: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7b40: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7b50: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7b60: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7b70: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7b80: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7b90: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7ba0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7bb0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7bc0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7bd0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7be0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7bf0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7c00: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7c10: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7c20: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7c30: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7c40: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7c50: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7c70: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7c80: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7c90: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7ca0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7cb0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7cc0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7cd0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7ce0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
7cf0: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
7d00: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
7d10: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
7d20: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
7d30: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
7d40: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
7d50: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
7d60: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
7d70: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
7d80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7d90: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
7da0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
7db0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
7dc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7dd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7de0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
7df0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
7e00: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
7e10: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
7e20: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
7e30: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7e40: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
7e50: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
7e60: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
7e70: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
7e80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
7e90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7ea0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7eb0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
7ec0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
7ed0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
7ee0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
7ef0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
7f00: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
7f10: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
7f20: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
7f30: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
7f40: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
7f50: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
7f60: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
7f70: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
7f80: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
7f90: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
7fa0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
7fb0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
7fc0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
7fd0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
7fe0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64  6)nSize;.}.#ifnd
7ff0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
8000: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8010: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8020: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
8030: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
8040: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
8050: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8060: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8070: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8080: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8090: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
80a0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
80b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
80c0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
80d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
80e0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
80f0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8100: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8110: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
8120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
8130: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
8140: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8150: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8160: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8170: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8180: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8190: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
81a0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
81b0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
81c0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
81d0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
81e0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
81f0: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8200: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8210: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
8220: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
8230: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
8240: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
8250: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8260: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8270: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8280: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8290: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
82a0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
82b0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
82c0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
82d0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
82e0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
82f0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8300: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8310: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
8320: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
8330: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
8340: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8350: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8360: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8370: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8380: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8390: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
83a0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
83b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
83c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
83d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
83e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
83f0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8400: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8410: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
8420: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8450: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8460: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8480: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8490: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
84a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
84b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
84c0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
84d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
84e0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
84f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8500: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8510: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
8520: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
8530: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8540: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8550: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8560: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8580: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8590: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
85a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
85b0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
85c0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
85d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
85e0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
85f0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8600: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8610: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8620: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8630: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8640: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8650: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8660: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8670: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8680: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8690: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
86a0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
86b0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
86c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
86d0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
86e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
86f0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8700: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8710: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8720: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8730: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8740: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8750: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8760: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8770: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8780: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8790: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
87a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
87b0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
87c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
87d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
87e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
87f0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8800: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8810: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
8820: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
8830: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
8840: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8850: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
8860: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8870: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8880: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8890: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
88a0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
88b0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
88c0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
88d0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
88e0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
88f0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8900: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8910: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8920: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8930: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8940: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8950: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8960: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8970: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8980: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8990: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
89a0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
89b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
89c0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
89d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
89e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
89f0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8a00: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8a10: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8a20: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8a30: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8a40: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8a50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8a60: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8a70: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8a80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8a90: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8aa0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8ab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ac0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8ad0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8ae0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8af0: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8b00: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8b10: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8b20: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8b30: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8b40: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8b50: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8b60: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8b70: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
8b80: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
8b90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8ba0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8bb0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
8bc0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8bd0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
8be0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
8bf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8c00: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8c10: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
8c20: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8c30: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8c40: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
8c50: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8c60: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
8c70: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8c80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8c90: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
8ca0: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
8cb0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
8cc0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
8cd0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
8ce0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
8cf0: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
8d00: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
8d10: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8d20: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
8d30: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
8d40: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
8d50: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
8d60: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
8d70: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
8d80: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
8d90: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
8da0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8db0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8dc0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
8dd0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
8de0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
8df0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8e00: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8e20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8e30: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
8e40: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8e50: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
8e60: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
8e70: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
8e80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
8e90: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
8ea0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
8eb0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
8ec0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
8ed0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
8ee0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
8ef0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
8f00: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
8f10: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
8f20: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
8f30: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
8f40: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
8f50: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
8f60: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
8f70: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
8f80: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8f90: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
8fa0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
8fb0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
8fc0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
8fd0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
8fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
8ff0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9000: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9010: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
9020: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
9030: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
9040: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
9050: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9060: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9070: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9080: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9090: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
90a0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
90b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
90c0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
90d0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
90e0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
90f0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9100: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9110: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
9120: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
9130: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
9140: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
9150: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9160: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9170: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9180: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9190: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
91c0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
91d0: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
91e0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9210: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
9220: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9230: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
9240: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9250: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9260: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9270: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9280: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9290: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
92a0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20  rn code */.  .  
92b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
92c0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
92d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
92e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
92f0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9300: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9310: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9320: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9330: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9340: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9350: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9360: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9370: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9390: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
93a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
93b0: 79 74 65 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  yte<pPage->pBt->
93c0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
93d0: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
93e0: 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74  hdr+7];.  assert
93f0: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
9400: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
9410: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
9420: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
9430: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
9440: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
9450: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
9460: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9470: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
9480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9490: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
94a0: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
94b0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
94c0: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
94d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
94e0: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
94f0: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9500: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9510: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
9520: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
9530: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
9540: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
9550: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
9560: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
9570: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9580: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65  hdr+5]);.  }else
9590: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
95a0: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
95b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
95c0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
95d0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
95e0: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
95f0: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
9600: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
9610: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
9620: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
9630: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
9640: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
9650: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
9660: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
9670: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
9680: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9690: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
96a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
96b0: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
96c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
96d0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
96e0: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
96f0: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
9700: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9710: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
9720: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
9730: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
9740: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9750: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
9760: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
9770: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9780: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9790: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
97a0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
97b0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
97c0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
97d0: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
97e0: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
97f0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9800: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9810: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
9820: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
9830: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
9840: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
9850: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9860: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9870: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9880: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9890: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
98a0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
98b0: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
98c0: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
98d0: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
98e0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
98f0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9900: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9920: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9930: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9940: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9950: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9960: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9970: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9980: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9990: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
99a0: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
99b0: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
99c0: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
99d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
99e0: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
99f0: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9a00: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9a10: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9a20: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9a30: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9a40: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9a50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9a60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
9a70: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
9a80: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
9a90: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
9aa0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
9ab0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
9ac0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
9ad0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9ae0: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
9af0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
9b00: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
9b10: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
9b20: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
9b30: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
9b40: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
9b50: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
9b60: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
9b70: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
9b80: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
9b90: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
9ba0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
9bb0: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
9bc0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
9bd0: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
9be0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
9bf0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9c00: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
9c10: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
9c20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9c30: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
9c40: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
9c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9c60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
9c70: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
9c80: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
9c90: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
9ca0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9cb0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9cc0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9cd0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9ce0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9cf0: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9d00: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9d10: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9d20: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9d30: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9d40: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
9d50: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
9d60: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
9d70: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
9d80: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
9d90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9da0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9db0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9dc0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9dd0: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9e00: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9e10: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9e20: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9e30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9e40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9e50: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9e60: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9e70: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9e80: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9e90: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
9ea0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
9eb0: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
9ec0: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
9ed0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
9ee0: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
9ef0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
9f00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9f10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9f20: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9f30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
9f40: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
9f50: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9f60: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
9f70: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
9f80: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
9f90: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
9fa0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
9fb0: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
9fc0: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
9fd0: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
9fe0: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
9ff0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
a000: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a010: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
a020: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a030: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a040: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a050: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a060: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a070: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a080: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a090: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a0a0: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a0b0: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a0c0: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a0d0: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a0e0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a0f0: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a100: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a110: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a120: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a130: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a140: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a150: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a160: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a170: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a180: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a190: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a1a0: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a1b0: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a1c0: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a1d0: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a1e0: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a1f0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a200: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a210: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a220: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a230: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a240: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a250: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a260: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a270: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a280: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a290: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a2a0: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a2b0: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a2c0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a2d0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a2e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a2f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a300: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a310: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a320: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a330: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a340: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a350: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a360: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a370: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a380: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a390: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a3a0: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a3b0: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a3c0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a3d0: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a3e0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a3f0: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a400: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a410: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a420: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a430: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a440: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a470: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a480: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a490: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a4a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a4b0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a4c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a4d0: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a4e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a4f0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a500: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a510: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a520: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a530: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a540: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a550: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a560: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a570: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a580: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a590: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a5a0: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a5b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a5c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a5d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a5e0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a5f0: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a600: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a610: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a620: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a630: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a640: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a650: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a660: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a670: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a680: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a690: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a6a0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a6b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a6c0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a6d0: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a6e0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a6f0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a700: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a710: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a720: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a730: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a740: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a750: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
a760: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a770: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a780: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a790: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a7a0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a7b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a7c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a7d0: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a7e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a7f0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a800: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a810: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a820: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a830: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a840: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a850: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a860: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a870: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
a880: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
a890: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
a8a0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
a8b0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
a8c0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
a8d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
a8e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
a8f0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
a900: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
a910: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
a920: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
a930: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
a940: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
a950: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
a960: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a970: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
a980: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
a990: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a9a0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
a9b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
a9c0: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
a9d0: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
a9e0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
a9f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
aa00: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
aa10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
aa20: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
aa30: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
aa40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
aa50: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
aa60: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
aa70: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
aa80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
aa90: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
aaa0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
aab0: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
aac0: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
aad0: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
aae0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
aaf0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ab00: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ab10: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
ab20: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
ab30: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ab40: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
ab50: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
ab60: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
ab70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ab80: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
ab90: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
aba0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
abb0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
abc0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
abd0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
abe0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
abf0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ac00: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ac10: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
ac20: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
ac30: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
ac40: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
ac50: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
ac60: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
ac70: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ac80: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
ac90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
aca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
acb0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
acc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
acd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ace0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
acf0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
ad00: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
ad10: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
ad20: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
ad30: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
ad40: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
ad50: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
ad60: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
ad70: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
ad80: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
ad90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
ada0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
adb0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
adc0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
add0: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
ade0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
adf0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
ae00: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
ae10: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
ae20: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
ae30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
ae40: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
ae50: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
ae60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
ae70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
ae80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ae90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
aea0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
aeb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
aec0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
aed0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
aee0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
aef0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
af00: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
af10: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
af20: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
af30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
af40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
af50: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
af60: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
af70: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
af80: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
af90: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
afa0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
afb0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
afc0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
afd0: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
afe0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
aff0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b000: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b010: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b020: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b030: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b040: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b050: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b060: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b070: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
b080: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b090: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b0a0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b0b0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
b0c0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b0d0: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b0e0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b0f0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b100: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
b110: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b120: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b130: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b140: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
b150: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b160: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b170: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b180: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b190: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b1a0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b1b0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b1c0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b1d0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b1e0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b1f0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b200: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b210: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b220: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b230: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b240: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b250: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b260: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b270: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b280: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b290: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b2a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b2b0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b2c0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b2d0: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
b2e0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b2f0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b300: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b310: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b320: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b330: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b340: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b350: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b360: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b370: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b380: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b390: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b3b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b3c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b3d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b3e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b3f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b400: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b410: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b420: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b430: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b450: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b460: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b470: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b480: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b490: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b4a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b4b0: 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74 6f  ght cause use to
b4c0: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
b4d0: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
b4e0: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
b4f0: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
b500: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
b510: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
b520: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
b530: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
b540: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
b550: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
b560: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
b570: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
b580: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
b590: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
b5a0: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
b5b0: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
b5c0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b5d0: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
b5e0: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
b5f0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
b600: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
b610: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
b620: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
b630: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74  .    {.      int
b640: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
b650: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
b660: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
b670: 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ray */.      int
b680: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f   sz;           /
b690: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
b6a0: 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
b6b0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b6c0: 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20  ellLast--;.     
b6d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
b6e0: 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
b6f0: 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74          pc = get
b700: 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
b710: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
b720: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b730: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
b740: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
b750: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b760: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
b770: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b780: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b790: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
b7a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b7b0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
b7c0: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63  }.        sz = c
b7d0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
b7e0: 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
b7f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b800: 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
b810: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
b820: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
b830: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
b840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b850: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b860: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b870: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b880: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
b890: 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69  +;.    }  .#endi
b8a0: 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  f..    /* Comput
b8b0: 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
b8c0: 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
b8d0: 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  ge */.    pc = g
b8e0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b8f0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
b900: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
b910: 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28   top;.    while(
b920: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
b930: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
b940: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b950: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b960: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b970: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
b980: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
b990: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
b9a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b9b0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
b9c0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
b9d0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
b9e0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
b9f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
ba00: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
ba10: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
ba20: 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a 20 20 20  pc+size+3 ){.   
ba30: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
ba40: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
ba50: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  scending order *
ba60: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
ba70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba80: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
ba90: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
baa0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
bab0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
bac0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
bad0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
bae0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
baf0: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
bb00: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
bb10: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
bb20: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
bb30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
bb40: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
bb50: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
bb60: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
bb70: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
bb80: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
bb90: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
bba0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
bbb0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
bbc0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
bbd0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
bbe0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
bbf0: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
bc00: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
bc10: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
bc20: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
bc30: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
bc40: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
bc50: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
bc60: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
bc70: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
bc80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
bc90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bca0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
bcb0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
bcc0: 65 20 3d 20 6e 46 72 65 65 20 2d 20 69 43 65 6c  e = nFree - iCel
bcd0: 6c 46 69 72 73 74 3b 0a 20 20 20 20 70 50 61 67  lFirst;.    pPag
bce0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
bcf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bd00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bd10: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
bd20: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
bd30: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
bd40: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
bd50: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
bd60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
bd70: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
bd80: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
bd90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bda0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bdb0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bdc0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bdd0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bde0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bdf0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
be00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
be10: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
be20: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
be30: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
be40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
be50: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
be60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
be70: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
be80: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
be90: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
bea0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
beb0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
bec0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
bed0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
bee0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
bef0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
bf00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
bf10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
bf20: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
bf30: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
bf40: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
bf50: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
bf60: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
bf70: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
bf80: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
bf90: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
bfa0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
bfb0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
bfc0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
bfd0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
bfe0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
bff0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
c000: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
c010: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
c020: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
c030: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c040: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c050: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c060: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c070: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c080: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c0a0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c0b0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c0c0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
c0d0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
c0e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
c0f0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
c100: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
c110: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
c120: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
c130: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
c140: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
c150: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
c160: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
c170: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
c180: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
c190: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
c1a0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
c1b0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
c1c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
c1d0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
c1e0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
c1f0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
c200: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c210: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
c220: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
c230: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
c240: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
c250: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
c260: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
c270: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
c280: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
c290: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
c2a0: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
c2b0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
c2c0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
c2d0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
c2e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c2f0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c300: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c310: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c320: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
c330: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
c340: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
c350: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
c360: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
c370: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
c380: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
c390: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
c3a0: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
c3b0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
c3c0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
c3d0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
c3e0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
c3f0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
c400: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
c410: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
c420: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
c430: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
c440: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
c450: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
c460: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
c470: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
c480: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
c490: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
c4a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
c4b0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
c4c0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
c4d0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
c4e0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c500: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
c510: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
c520: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
c530: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
c540: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
c550: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
c560: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
c570: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
c580: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
c590: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
c5a0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
c5b0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
c5c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c5d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c5e0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
c5f0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
c600: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
c610: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
c620: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
c630: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
c640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
c650: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
c660: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c670: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c680: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c690: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c6a0: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
c6b0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
c6c0: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
c6d0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
c6e0: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
c6f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
c700: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
c710: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
c720: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
c730: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
c740: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
c750: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c760: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
c770: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
c780: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
c790: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c7a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c7b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c7c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
c7d0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
c7e0: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
c7f0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
c800: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
c810: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
c820: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
c830: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
c840: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
c850: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
c860: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
c870: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c880: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
c890: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
c8a0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
c8b0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
c8c0: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
c8d0: 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67  ic Pgno pagerPag
c8e0: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
c8f0: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61  *pBt){.  int nPa
c900: 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  ge = -1;.  int r
c910: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  c;.  assert( pBt
c920: 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63  ->pPage1 );.  rc
c930: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
c940: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
c950: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
c960: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c970: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d  ITE_OK || nPage=
c980: 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =-1 );.  return 
c990: 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a  (Pgno)nPage;.}..
c9a0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c9b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c9c0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
c9d0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
c9e0: 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f   is just a.** co
c9f0: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
ca00: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
ca10: 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  e calls to btree
ca20: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a  GetPage() and .*
ca30: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
ca40: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
ca50: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
ca60: 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50  n the value *ppP
ca70: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73  age is set to is
ca80: 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
ca90: 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
caa0: 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
cab0: 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
cac0: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
cad0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
cae0: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
caf0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
cb00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
cb10: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
cb20: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
cb30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cb40: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
cb50: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
cb60: 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57  *ppPage     /* W
cb70: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
cb80: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  inter here */.){
cb90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45 53  .  int rc;.  TES
cba0: 54 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73  TONLY( Pgno iLas
cbb0: 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  tPg = pagerPagec
cbc0: 6f 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20 61  ount(pBt); ).  a
cbd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cbe0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
cbf0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d  utex) );..  rc =
cc00: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
cc10: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
cc20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
cc30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cc40: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
cc50: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
cc60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cc70: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
cc80: 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
cc90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
cca0: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
ccb0: 65 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77  ed page number w
ccc0: 61 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 67  as either 0 or g
ccd0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
cce0: 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
ccf0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61 67   of the last pag
cd00: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
cd10: 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
cd20: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20   should return. 
cd30: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   ** SQLITE_CORRU
cd40: 50 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  PT or some other
cd50: 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c   error (i.e. SQL
cd60: 49 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b  ITE_FULL). Check
cd70: 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
cd80: 69 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a 2f  is the case.  */
cd90: 0a 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f  .  assert( (pgno
cda0: 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73  >0 && pgno<=iLas
cdb0: 74 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49  tPg) || rc!=SQLI
cdc0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63  TE_OK );.  testc
cdd0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
cde0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
cdf0: 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20  ==iLastPg );..  
ce00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ce10: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
ce20: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
ce30: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
ce40: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
ce50: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
ce60: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
ce70: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
ce80: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
ce90: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
cea0: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
ceb0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
cec0: 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ow==0 || sqlite3
ced0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
cee0: 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  t(pPage->pDbPage
cef0: 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )>1 );.    asser
cf00: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
cf10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cf20: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
cf30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cf40: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
cf50: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
cf60: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
cf70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cf80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cf90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cfa0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
cfb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
cfc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cfd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
cfe0: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
cff0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
d000: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
d010: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
d020: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
d030: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
d040: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
d050: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
d060: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
d070: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d080: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d090: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
d0a0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
d0b0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
d0c0: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
d0d0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
d0e0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
d0f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
d100: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
d110: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
d120: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
d130: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
d140: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
d150: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
d160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
d170: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
d180: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
d190: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
d1a0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
d1b0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d1c0: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
d1d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d1e0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d1f0: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
d200: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
d210: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
d220: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d230: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d240: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
d250: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
d260: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d270: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d280: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
d290: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
d2a0: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
d2b0: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
d2c0: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
d2d0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
d2e0: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
d2f0: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
d300: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
d310: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
d320: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d330: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
d340: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
d350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
d360: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
d370: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
d380: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
d390: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
d3a0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
d3b0: 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
d3c0: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
d3d0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
d3e0: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
d3f0: 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
d400: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
d410: 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
d420: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
d430: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
d440: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
d450: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
d460: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
d470: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
d480: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
d490: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d4a0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
d4b0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
d4c0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
d4d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
d4e0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
d4f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d500: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
d510: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
d520: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
d530: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
d540: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
d550: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
d560: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
d570: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
d580: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d590: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
d5a0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
d5b0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
d5c0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
d5d0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
d5e0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
d5f0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
d600: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
d610: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d620: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
d630: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
d640: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
d650: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
d660: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
d670: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
d680: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
d690: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d6a0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
d6b0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
d6c0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
d6d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
d6e0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
d6f0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d700: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
d710: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
d720: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
d730: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
d740: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
d750: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
d760: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
d770: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
d780: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
d790: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
d7a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d7b0: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
d7c0: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
d7d0: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
d7e0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
d7f0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d800: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
d810: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
d820: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
d830: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
d840: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
d850: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d870: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
d880: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
d890: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
d8a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d8b0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
d8c0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
d8d0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
d8e0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
d8f0: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
d900: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
d910: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
d920: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
d930: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
d940: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
d950: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d960: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
d970: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
d980: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
d990: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
d9a0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
d9b0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
d9c0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
d9d0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
d9e0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
d9f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
da00: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
da10: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
da20: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
da30: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
da40: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
da50: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
da60: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
da70: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
da80: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
da90: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
daa0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
dab0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
dac0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
dad0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
dae0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
daf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
db00: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
db10: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
db20: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
db30: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
db40: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
db50: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
db60: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
db70: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
db80: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
db90: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
dba0: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
dbb0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
dbc0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
dbd0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
dbe0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
dbf0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
dc00: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
dc10: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
dc20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
dc30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
dc40: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
dc50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
dc60: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
dc70: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
dc80: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
dc90: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
dca0: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
dcb0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
dcc0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
dcd0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
dce0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
dcf0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
dd00: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
dd10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
dd20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
dd30: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
dd40: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
dd50: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
dd60: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
dd70: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
dd80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dd90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
dda0: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
ddb0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
ddc0: 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
ddd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
dde0: 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
ddf0: 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
de00: 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
de10: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
de20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
de30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
de40: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
de50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
de60: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
de70: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
de80: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
de90: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
dea0: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
deb0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
dec0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
ded0: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
dee0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65  .  */.  if( isMe
def0: 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e  mdb==0 && zFilen
df00: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
df10: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73  [0] ){.    if( s
df20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
df30: 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
df40: 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69  abled ){.      i
df50: 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
df60: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
df70: 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
df80: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
df90: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
dfa0: 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (nFullPathname);
dfb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
dfc0: 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
dfd0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  d;.      p->shar
dfe0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
dff0: 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
e000: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
e010: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
e020: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e030: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e040: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e050: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e060: 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
e070: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
e080: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e090: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
e0a0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
e0b0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
e0c0: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
e0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e0e0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
e0f0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
e100: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
e110: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e120: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
e130: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
e140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e150: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
e160: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
e170: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
e180: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
e190: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
e1a0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
e1b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
e1c0: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
e1d0: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
e1e0: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
e1f0: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
e200: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
e210: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
e220: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
e230: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
e240: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
e250: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
e260: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
e270: 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
e280: 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
e290: 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
e2a0: 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
e2b0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e2d0: 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
e2e0: 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
e2f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e300: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e310: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
e320: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
e330: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e340: 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
e350: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e360: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
e370: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e380: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
e390: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
e3a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e3b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e3c0: 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
e3d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
e3e0: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
e3f0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
e400: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
e410: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e440: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
e450: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
e460: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
e470: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
e480: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
e490: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
e4a0: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
e4b0: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
e4c0: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
e4d0: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
e4e0: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
e4f0: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
e500: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
e510: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
e520: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
e530: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
e540: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
e550: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
e560: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
e570: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
e580: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
e590: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
e5a0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
e5b0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
e5c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
e5d0: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
e5e0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
e5f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
e600: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
e610: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
e620: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
e630: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
e640: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
e650: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
e660: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
e670: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
e680: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
e690: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
e6a0: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
e6b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
e6c0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
e6d0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
e6e0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
e6f0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
e700: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
e710: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
e720: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
e730: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
e740: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
e750: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
e760: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
e770: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
e780: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
e790: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
e7a0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
e7b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
e7c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e7d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
e7e0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
e7f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e800: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
e810: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
e820: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
e850: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
e860: 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
e870: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e880: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
e890: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
e8a0: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
e8b0: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
e8c0: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
e8d0: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
e8e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e8f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
e900: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e910: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
e920: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
e930: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
e940: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
e950: 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
e960: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
e970: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
e980: 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
e990: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
e9a0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e9b0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
e9c0: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
e9d0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
e9e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e9f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ea00: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
ea10: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
ea20: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
ea30: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
ea40: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
ea50: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
ea60: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
ea70: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
ea80: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
ea90: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
eaa0: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
eab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
eac0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
ead0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
eae0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
eaf0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
eb00: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
eb10: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
eb20: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
eb30: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
eb40: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
eb50: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
eb60: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
eb70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
eb80: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
eb90: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
eba0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
ebb0: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
ebc0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
ebd0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
ebe0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
ebf0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
ec00: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
ec10: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
ec20: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
ec30: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
ec40: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
ec50: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
ec60: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
ec70: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
ec80: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ec90: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
eca0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
ecb0: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
ecc0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
ecd0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
ece0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
ecf0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
ed00: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
ed10: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
ed20: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
ed30: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
ed40: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
ed50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ed60: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
ed70: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
ed80: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
ed90: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
eda0: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
edb0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
edc0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
edd0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
ede0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
edf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ee00: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ee10: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ee20: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
ee30: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
ee40: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
ee50: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ee60: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
ee70: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
ee80: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
ee90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
eea0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
eeb0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
eec0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
eed0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
eee0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
eef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ef00: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ef10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ef20: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
ef30: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
ef40: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
ef50: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
ef60: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
ef70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ef80: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
ef90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
efa0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
efb0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
efc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
efd0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
efe0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
eff0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f000: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
f010: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
f020: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
f030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
f040: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
f050: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
f060: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
f070: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
f080: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
f090: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
f0a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f0b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f0c0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
f0d0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
f0e0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
f0f0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f120: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
f130: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
f140: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
f150: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
f160: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
f170: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
f180: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
f190: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
f1a0: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
f1b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f1c0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
f1d0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
f1e0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
f1f0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
f200: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
f210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f220: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
f230: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
f240: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
f250: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
f260: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
f270: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
f280: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
f290: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
f2a0: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
f2b0: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
f2c0: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
f2d0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f2e0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
f2f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f300: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
f310: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
f320: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
f330: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f340: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
f350: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
f360: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
f370: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
f380: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
f390: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
f3a0: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
f3b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
f3c0: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
f3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
f3e0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
f3f0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f400: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f410: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
f420: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f430: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
f440: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
f450: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
f460: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
f470: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
f480: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
f490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f4a0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
f4b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
f4c0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
f4d0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
f4e0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
f4f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f500: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
f510: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f520: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
f530: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
f540: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f550: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f560: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
f570: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
f580: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
f590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f5a0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
f5b0: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
f5c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f5d0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f5e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
f5f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
f600: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f610: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
f620: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
f630: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
f640: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f650: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
f660: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
f670: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f680: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
f690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
f6b0: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
f6c0: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
f6d0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
f6e0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
f6f0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
f700: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
f710: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
f720: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
f730: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
f740: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
f750: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
f760: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
f770: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
f780: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
f790: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
f7a0: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
f7b0: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
f7c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f7d0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
f7e0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
f7f0: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
f800: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
f810: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
f820: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f830: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
f840: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
f850: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
f860: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f870: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f880: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
f890: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
f8a0: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
f8b0: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
f8c0: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
f8d0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
f8e0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f8f0: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
f900: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
f910: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f920: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f930: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
f940: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f950: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
f960: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f970: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f980: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f990: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
f9a0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
f9b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
f9c0: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
f9d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f9e0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
f9f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
fa00: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
fa10: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
fa20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
fa30: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
fa40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fa50: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
fa60: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
fa70: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
fa80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
fa90: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
faa0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
fab0: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
fac0: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
fad0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
fae0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
faf0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
fb00: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
fb10: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
fb20: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
fb30: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
fb40: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
fb50: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
fb60: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
fb70: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
fb80: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
fb90: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
fba0: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
fbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
fbc0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
fbd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
fbe0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
fbf0: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
fc00: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
fc10: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
fc20: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
fc30: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
fc40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
fc50: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
fc60: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
fc70: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
fc80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fc90: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
fca0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
fcb0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
fcc0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
fcd0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
fce0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
fcf0: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
fd00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
fd10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fd20: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
fd30: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
fd40: 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
fd50: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
fd60: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
fd70: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
fd80: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
fd90: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
fda0: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
fdb0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
fdc0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fdd0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
fde0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
fdf0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
fe00: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
fe10: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
fe20: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
fe30: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
fe40: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
fe50: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
fe60: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
fe70: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
fe80: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
fe90: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
fea0: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
feb0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
fec0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
fed0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
fee0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
fef0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
ff00: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
ff10: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
ff20: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
ff30: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
ff40: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
ff50: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
ff60: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
ff70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
ff80: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
ff90: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
ffa0: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
ffb0: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
ffc0: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
ffd0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
ffe0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
fff0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
10000 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
10010 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
10020 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
10030 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
10040 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
10050 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
10060 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
10070 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
10080 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
10090 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
100a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
100b0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
100c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
100d0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
100e0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
100f0 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
10100 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
10110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10120 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
10130 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
10140 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
10150 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10160 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
10170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10180 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
10190 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
101a0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
101b0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
101c0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
101d0 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
101e0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
101f0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
10200 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
10210 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
10220 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10230 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10250 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10260 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
10270 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
10280 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
10290 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
102a0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
102b0 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
102c0 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
102d0 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
102e0 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
102f0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10300 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
10310 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
10320 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10330 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10340 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10350 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
10360 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
10370 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
10380 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
10390 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
103a0 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
103b0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
103c0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
103d0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
103e0 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
103f0 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
10400 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
10410 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
10420 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
10430 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
10440 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
10450 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
10460 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
10470 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
10480 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
10490 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
104a0 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
104b0 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
104c0 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
104d0 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
104e0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
104f0 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
10500 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
10510 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
10520 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
10530 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
10540 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10550 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
10560 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10570 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10580 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10590 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
105a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
105b0 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
105c0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
105d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
105e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
105f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10600 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10610 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
10620 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
10630 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
10640 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
10650 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
10660 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
10670 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
10680 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
10690 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
106a0 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
106b0 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
106c0 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
106d0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
106e0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
106f0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10700 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
10710 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
10720 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
10730 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
10740 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10750 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
10760 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
10770 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
10780 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
10790 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
107a0 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
107b0 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
107c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
107d0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
107e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
107f0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
10800 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
10810 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
10820 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10830 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10840 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10850 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10860 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10870 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10880 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10890 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
108b0 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
108c0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
108d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
108e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
108f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
10900 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
10910 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
10920 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
10930 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
10940 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
10950 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
10960 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
10970 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
10980 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
10990 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
109a0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
109b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
109c0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
109d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
109e0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
109f0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
10a00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10a10 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
10a20 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
10a30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10a40 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
10a50 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
10a60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10a80 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10a90 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10aa0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
10ab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10ac0 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
10ad0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
10ae0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
10af0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
10b00 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
10b10 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
10b20 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
10b30 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10b40 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
10b50 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
10b60 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
10b70 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
10b80 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
10b90 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
10ba0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
10bb0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
10bc0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
10bd0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
10be0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
10bf0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
10c00 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
10c10 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
10c20 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
10c30 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
10c40 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
10c50 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
10c60 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
10c70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10c80 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
10c90 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
10ca0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
10cb0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10cc0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
10cd0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
10ce0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
10cf0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
10d00 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
10d10 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
10d20 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
10d30 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
10d40 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
10d50 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
10d60 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
10d70 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
10d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
10d90 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
10da0 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
10db0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
10dc0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
10dd0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
10de0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
10df0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
10e00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10e10 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
10e20 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
10e30 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
10e40 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
10e50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10e60 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
10e70 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10e80 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
10e90 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
10ea0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
10eb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10ec0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
10ed0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
10ee0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
10ef0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
10f00 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10f10 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
10f20 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
10f30 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
10f40 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10f50 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
10f60 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10f70 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
10f80 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
10f90 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
10fa0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
10fb0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
10fc0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
10fd0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
10fe0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
10ff0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11000 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11010 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11020 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11030 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11040 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
11050 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11060 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11070 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11080 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11090 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
110a0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
110b0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
110c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
110d0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
110e0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
110f0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11100 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11110 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11120 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11130 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11140 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11150 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11160 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11180 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11190 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
111a0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
111b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
111c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
111d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
111e0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
111f0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11200 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11210 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11220 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11230 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11240 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11250 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11270 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11280 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11290 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
112a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
112b0 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
112c0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
112d0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
112e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
112f0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11300 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11310 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11320 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11330 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11340 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11350 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11360 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11370 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11380 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11390 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
113a0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
113b0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
113c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
113d0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
113e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
113f0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11400 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11410 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
11420 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11430 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11440 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11450 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11460 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11470 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
11480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11490 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
114a0 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
114b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
114c0 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
114d0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
114e0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
114f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
11500 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
11510 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
11520 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11530 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
11540 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
11550 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
11560 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
11570 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
11580 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
11590 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
115a0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
115b0 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
115c0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
115d0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
115e0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
115f0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
11600 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
11610 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11620 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11640 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
11650 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11660 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11670 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11680 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
11690 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
116a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
116b0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
116c0 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
116d0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
116e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
116f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
11700 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
11710 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
11720 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
11730 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11740 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
11750 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11760 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11770 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
11780 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11790 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
117a0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
117b0 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
117c0 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
117d0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
117e0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
117f0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
11800 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
11810 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
11820 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11830 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
11840 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
11850 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
11860 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
11870 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11880 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
11890 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
118a0 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
118b0 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
118c0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
118d0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
118e0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
118f0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
11900 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
11910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11920 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11930 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11940 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
11950 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
11960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11970 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
11980 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
11990 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
119a0 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
119b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
119c0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
119d0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
119e0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
119f0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
11a00 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
11a10 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
11a20 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
11a30 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11a40 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11a50 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
11a60 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
11a70 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
11a80 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
11a90 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
11aa0 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
11ab0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
11ac0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
11ad0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
11ae0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
11af0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11b00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11b20 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
11b30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11b40 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
11b50 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
11b60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11b70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
11b80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
11b90 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
11ba0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
11bb0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
11bc0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
11bd0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
11be0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
11bf0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
11c00 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
11c10 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
11c20 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
11c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
11c40 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
11c50 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
11c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11c70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   ){.    goto pag
11c80 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11c90 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
11ca0 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  e>0 ){.    int p
11cb0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  ageSize;.    int
11cc0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
11cd0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
11ce0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
11cf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
11d00 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
11d10 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
11d20 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
11d30 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11d40 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11d50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
11d60 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
11d70 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
11d80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
11d90 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
11da0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
11db0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
11dd0 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64  he maximum embed
11de0 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
11df0 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25  t be exactly 25%
11e00 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d  .  And the minim
11e10 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64  um.    ** embedd
11e20 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
11e30 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f   be 12.5% for bo
11e40 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64  th leaf-data and
11e50 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a   non-leaf-data..
11e60 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
11e70 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
11e80 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
11e90 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
11ea0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
11eb0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
11ec0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
11ed0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
11ee0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
11ef0 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
11f00 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
11f10 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
11f20 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
11f30 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a     }.    pageSiz
11f40 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61  e = get2byte(&pa
11f50 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  ge1[16]);.    if
11f60 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
11f70 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20  pageSize)!=0 || 
11f80 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a  pageSize<512 ||.
11f90 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
11fa0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32  MAX_PAGE_SIZE<32
11fb0 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e  768 && pageSize>
11fc0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
11fd0 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20  SIZE).    ){.   
11fe0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
11ff0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12000 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
12010 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
12020 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
12030 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
12040 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
12050 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e   pageSize!=pBt->
12060 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
12070 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
12080 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
12090 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
120a0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
120b0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
120c0 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
120d0 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
120e0 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
120f0 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
12100 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
12110 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
12120 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
12130 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
12140 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
12150 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
12160 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
12170 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
12180 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
12190 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
121a0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
121b0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
121c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
121d0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
121e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
121f0 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69   = (u16)usableSi
12200 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
12210 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
12220 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
12230 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
12240 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12250 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
12260 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
12270 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
12280 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
122b0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
122c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
122d0 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
122e0 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
122f0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12300 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12310 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
12320 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
12330 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
12340 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
12350 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
12360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12370 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
12380 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
12390 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
123a0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
123b0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
123c0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
123d0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
123e0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
123f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
12400 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
12410 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
12420 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
12430 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
12440 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
12450 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
12460 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
12470 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
12480 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
12490 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
124a0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
124b0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
124c0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
124d0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
124e0 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
124f0 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
12500 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
12510 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
12520 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
12530 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
12540 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
12550 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
12560 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
12570 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
12580 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
12590 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
125a0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
125b0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
125c0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
125d0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
125e0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
125f0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
12600 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
12610 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
12620 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
12630 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
12640 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
12650 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
12660 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
12670 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
12680 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
12690 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
126a0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
126b0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
126c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
126d0 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
126e0 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
126f0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
12700 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
12710 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
12720 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
12730 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
12740 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
12750 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12760 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
12770 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
12780 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
12790 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
127a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
127b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
127c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
127d0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
127e0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
127f0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
12800 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
12810 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
12820 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
12830 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
12840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
12850 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
12860 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
12870 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
12880 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
12890 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
128a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
128b0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
128c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
128d0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
128e0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
128f0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
12900 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
12910 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
12920 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
12930 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12940 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12950 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12960 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
12970 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12980 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
12990 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
129a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
129b0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
129c0 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
129d0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
129e0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
129f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12a00 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
12a10 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
12a20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12a30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
12a40 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
12a50 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
12a60 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
12a70 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
12a80 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
12a90 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
12aa0 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
12ab0 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
12ac0 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
12ad0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
12ae0 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
12af0 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
12b00 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
12b10 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
12b20 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
12b30 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
12b40 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
12b50 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
12b60 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
12b70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
12b80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12b90 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12ba0 29 3b 0a 20 20 2f 2a 20 54 68 65 20 64 61 74 61  );.  /* The data
12bb0 62 61 73 65 20 73 69 7a 65 20 68 61 73 20 61 6c  base size has al
12bc0 72 65 61 64 79 20 62 65 65 6e 20 6d 65 61 73 75  ready been measu
12bd0 72 65 64 20 61 6e 64 20 63 61 63 68 65 64 2c 20  red and cached, 
12be0 73 6f 20 66 61 69 6c 75 72 65 0a 20 20 2a 2a 20  so failure.  ** 
12bf0 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 68 65  is impossible he
12c00 72 65 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  re.  If the orig
12c10 69 6e 61 6c 20 73 69 7a 65 20 6d 65 61 73 75 72  inal size measur
12c20 65 6d 65 6e 74 20 66 61 69 6c 65 64 2c 20 74 68  ement failed, th
12c30 65 6e 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  en.  ** processi
12c40 6e 67 20 61 62 6f 72 74 73 20 62 65 66 6f 72 65  ng aborts before
12c50 20 65 6e 74 65 72 69 6e 67 20 74 68 69 73 20 72   entering this r
12c60 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 63 20  outine. */.  rc 
12c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
12c80 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
12c90 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
12ca0 69 66 28 20 4e 45 56 45 52 28 72 63 21 3d 53 51  if( NEVER(rc!=SQ
12cb0 4c 49 54 45 5f 4f 4b 29 20 7c 7c 20 6e 50 61 67  LITE_OK) || nPag
12cc0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
12cd0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20  n rc;.  }.  pP1 
12ce0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
12cf0 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
12d00 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
12d10 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
12d20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12d30 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
12d40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12d50 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
12d60 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
12d70 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
12d80 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
12d90 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
12da0 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
12db0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
12dc0 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
12dd0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
12de0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
12df0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
12e00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
12e10 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
12e20 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
12e30 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
12e40 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
12e50 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
12e60 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12e70 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
12e80 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
12e90 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
12ea0 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
12eb0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
12ec0 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
12ed0 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
12ee0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
12ef0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
12f00 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
12f10 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
12f20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
12f40 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
12f50 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
12f60 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
12f70 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12f80 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
12f90 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12fa0 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
12fb0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
12fc0 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
12fd0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
12fe0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
12ff0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13000 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
13010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13020 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
13030 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
13040 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
13050 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
13060 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
13070 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13080 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
13090 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
130a0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
130b0 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
130c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
130d0 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
130e0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
130f0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
13100 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
13110 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13120 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
13130 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
13140 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
13150 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
13160 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
13170 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
13180 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
13190 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
131a0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
131b0 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
131c0 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
131d0 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
131e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
131f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
13200 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
13210 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
13220 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
13230 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13240 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
13250 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
13260 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
13270 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
13280 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
13290 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
132a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
132b0 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
132c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
132d0 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
132e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
132f0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
13300 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13310 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
13320 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13330 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
13340 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13350 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
13360 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
13370 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
13380 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
13390 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
133a0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
133b0 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
133c0 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
133d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
133e0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
133f0 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
13400 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13410 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
13420 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
13430 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
13440 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
13450 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
13460 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
13470 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
13480 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
13490 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
134a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
134b0 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
134c0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
134d0 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
134e0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
134f0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
13500 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
13510 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
13520 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
13530 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
13540 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
13550 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
13560 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
13570 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
13580 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
13590 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
135a0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
135b0 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
135c0 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
135d0 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
135e0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
135f0 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
13600 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
13610 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
13620 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
13630 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
13640 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
13650 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
13660 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
13670 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
13680 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
13690 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
136a0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
136b0 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
136c0 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
136d0 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
136e0 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
136f0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
13700 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
13710 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13730 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13740 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
13750 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13760 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
13770 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
13780 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
13790 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
137a0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
137b0 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
137c0 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
137d0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
137e0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
137f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
13800 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
13810 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13820 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
13830 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
13840 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
13850 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
13860 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
13870 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
13880 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
13890 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
138a0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
138b0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
138c0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
138d0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
138e0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
138f0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
13900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13910 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13920 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
13930 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13940 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
13950 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
13960 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
13970 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
13980 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
13990 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
139a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
139b0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
139c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
139d0 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
139e0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
139f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
13a00 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
13a10 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
13a20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
13a30 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
13a40 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
13a50 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
13a60 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
13a70 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
13a80 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
13a90 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
13aa0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
13ab0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
13ac0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
13ad0 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
13ae0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b00 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
13b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
13b20 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
13b30 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
13b40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13b50 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
13b60 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
13b70 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
13b80 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
13b90 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
13ba0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
13bb0 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
13bc0 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
13bd0 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
13be0 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
13bf0 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
13c00 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
13c10 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
13c20 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
13c30 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
13c40 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
13c50 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
13c60 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
13c70 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
13c80 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
13c90 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
13ca0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
13cb0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ..  do {.    /* 
13cc0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
13cd0 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
13ce0 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
13cf0 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
13d00 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
13d10 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
13d20 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
13d30 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
13d40 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
13d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
13d60 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
13d70 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
13d80 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
13d90 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
13da0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
13db0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13dc0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
13dd0 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
13de0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
13df0 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
13e00 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
13e10 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
13e20 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
13e30 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
13e40 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
13e50 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
13e60 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
13e70 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
13e80 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
13e90 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
13ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13eb0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
13ec0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
13ed0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
13ee0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
13ef0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
13f00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13f10 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
13f20 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
13f30 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
13f40 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
13f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13f70 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
13f80 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
13f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13fa0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
13fb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13fc0 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
13fd0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
13ff0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
14000 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
14010 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
14020 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
14030 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
14040 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
14050 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
14060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14070 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
14080 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
14090 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
140a0 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
140b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
140c0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
140d0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
140e0 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b  .assert( p->lock
140f0 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
14100 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
14110 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
14120 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
14130 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
14140 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
14150 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
14160 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
14170 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
14180 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
14190 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
141a0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
141b0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
141c0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
141d0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
141e0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
141f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14200 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
14210 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14220 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
14230 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
14240 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  rflag ){.      a
14250 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
14260 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
14270 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
14280 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63        pBt->isExc
14290 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72  lusive = (u8)(wr
142a0 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23  flag>1);.    }.#
142b0 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
142c0 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72  s_begun:.  if( r
142d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
142e0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a  wrflag ){.    /*
142f0 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73   This call makes
14300 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70   sure that the p
14310 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72  ager has the cor
14320 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20  rect number of. 
14330 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70     ** open savep
14340 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65  oints. If the se
14350 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
14360 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  s greater than 0
14370 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20   and.    ** the 
14380 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  sub-journal is n
14390 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
143a0 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65   then it will be
143b0 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20   opened here..  
143c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
143d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
143e0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
143f0 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
14400 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  epoint);.  }..  
14410 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14430 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14440 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
14450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14460 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
14470 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
14480 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
14490 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
144a0 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
144b0 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
144c0 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
144d0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
144e0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
144f0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
14500 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
14510 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
14520 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
14530 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
14540 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
14550 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
14560 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14580 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
14590 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
145a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
145b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
145c0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
145d0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
145e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
145f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14600 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
14610 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
14620 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
14630 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f  Bt;.  u8 isInitO
14640 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
14650 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  nit;.  Pgno pgno
14660 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
14670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14680 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
14690 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
146a0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
146b0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
146c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
146d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
146e0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
146f0 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
14700 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
14710 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
14720 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
14730 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
14740 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
14750 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75  );..    ptrmapPu
14760 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
14770 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20  pCell, &rc);..  
14780 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
14790 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
147a0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
147b0 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20  4byte(pCell);.  
147c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
147d0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
147e0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
147f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
14800 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
14810 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
14820 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
14830 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14840 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14850 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
14860 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
14870 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
14880 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
14890 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
148a0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
148b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
148c0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
148d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
148e0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
148f0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
14900 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
14910 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
14920 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
14930 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
14940 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
14950 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
14960 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
14970 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
14980 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
14990 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
149a0 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
149b0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
149c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
149d0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
149e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
149f0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
14a00 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
14a10 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
14a20 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
14a30 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
14a40 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
14a50 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
14a60 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
14a70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
14a80 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
14a90 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
14aa0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
14ab0 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
14ac0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
14ad0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
14ae0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
14b00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
14b10 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
14b20 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
14b30 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
14b40 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
14b50 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
14b60 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
14b70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14b80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
14b90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14ba0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
14bb0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
14bc0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
14bd0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
14be0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
14bf0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
14c00 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
14c10 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14c20 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
14c30 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
14c40 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
14c50 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
14c60 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
14c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14c80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
14c90 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70  }.    put4byte(p
14ca0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f  Page->aData, iTo
14cb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14cc0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
14cd0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
14ce0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
14cf0 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74  t nCell;..    bt
14d00 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
14d10 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  e);.    nCell = 
14d20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14d30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14d40 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
14d50 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
14d60 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
14d70 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
14d80 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
14d90 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
14da0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
14db0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
14dc0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
14dd0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
14de0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
14df0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
14e00 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
14e10 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
14e20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
14e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14e40 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
14e50 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
14e60 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
14e70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
14e90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ea0 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
14eb0 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
14ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
14ed0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
14ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
14ef0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14f00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14f10 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
14f20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
14f30 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
14f40 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
14f50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
14f60 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14f70 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
14f80 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
14f90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
14fa0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
14fb0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
14fc0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14fd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14fe0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
14ff0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
15000 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
15010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15020 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
15030 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
15040 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
15050 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
15060 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
15070 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
15080 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
15090 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
150a0 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
150b0 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
150c0 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
150d0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
150e0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
150f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
15100 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
15110 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
15120 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
15130 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
15140 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
15150 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
15160 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
15170 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
15180 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
15190 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
151a0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
151b0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
151c0 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
151d0 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
151e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
151f0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
15200 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
15210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15220 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
15230 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
15240 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
15250 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
15260 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
15270 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
15280 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
15290 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
152a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
152b0 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
152c0 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
152d0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
152e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
152f0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
15300 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
15310 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
15320 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
15330 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
15340 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
15350 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
15360 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15370 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
15380 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
15390 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
153a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
153b0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
153c0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
153d0 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
153e0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
153f0 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
15400 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
15410 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
15420 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
15430 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15440 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
15450 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
15460 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
15470 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
15480 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
15490 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
154a0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
154b0 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
154c0 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
154d0 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
154e0 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
154f0 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
15500 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
15510 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
15520 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
15530 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
15540 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15550 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
15560 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
15570 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
15580 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
15590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
155a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
155b0 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
155c0 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
155d0 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
155e0 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
155f0 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
15600 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
15610 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
15620 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
15630 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
15640 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
15650 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
15660 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
15670 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
15680 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
15690 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
156a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
156b0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
156c0 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
156d0 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
156e0 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
156f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
15700 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15710 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
15720 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
15730 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
15740 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
15750 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
15760 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
15770 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
15780 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
15790 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
157a0 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
157b0 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
157c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
157d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
157e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
157f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
15800 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
15810 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
15820 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
15830 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
15840 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
15850 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
15860 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
15870 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
15880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
158a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
158b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
158c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
158d0 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
158e0 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
158f0 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
15900 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
15910 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
15920 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
15930 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
15940 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
15950 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
15960 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
15970 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
15980 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
15990 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
159a0 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
159b0 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
159c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
159d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
159e0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
159f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15a00 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
15a10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
15a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a30 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
15a40 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
15a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15a60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
15a70 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
15a80 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
15a90 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
15aa0 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
15ab0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
15ac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15ae0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15af0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
15b00 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
15b10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
15b20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
15b30 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
15b40 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
15b50 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
15b60 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
15b70 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
15b80 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
15b90 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
15ba0 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
15bb0 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
15bc0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
15bd0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
15be0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
15bf0 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
15c00 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
15c10 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
15c20 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
15c30 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
15c40 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
15c50 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
15c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15c70 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
15c80 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
15c90 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
15ca0 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
15cb0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
15cc0 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
15cd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
15ce0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
15cf0 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
15d00 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
15d10 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
15d20 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
15d30 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ro, this functio
15d40 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61  n assumes.** tha
15d50 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
15d60 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
15d70 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
15d80 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75  until.** it retu
15d90 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
15da0 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  or an error, and
15db0 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68   that nFin is th
15dc0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70  e.** number of p
15dd0 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ages the databas
15de0 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  e file will cont
15df0 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a  ain after this .
15e00 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f  ** process is co
15e10 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e  mplete.  If nFin
15e20 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20   is zero, it is 
15e30 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
15e40 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
15e50 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
15e60 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20  a finite amount 
15e70 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63  of times.** whic
15e80 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
15e90 20 65 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c   empty the freel
15ea0 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74  ist.  A full aut
15eb0 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e  ovacuum.** has n
15ec0 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d  Fin>0.  A "PRAGM
15ed0 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61  A incremental_va
15ee0 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d  cuum" has nFin==
15ef0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
15f00 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
15f10 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
15f20 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
15f30 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20  LastPg){.  Pgno 
15f40 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
15f50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15f60 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
15f70 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
15f80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
15f90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15fa0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15fb0 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
15fc0 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
15fd0 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
15fe0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
15ff0 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
16000 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16010 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
16020 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
16030 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
16040 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
16050 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
16060 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
16070 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
16080 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
16090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
160a0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
160b0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
160c0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
160d0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
160e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
160f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16110 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
16120 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
16130 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16140 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16150 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
16160 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16170 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
16180 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
16190 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
161a0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
161b0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
161c0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
161d0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
161e0 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
161f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
16200 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
16210 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
16220 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
16230 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
16240 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
16250 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
16260 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
16270 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
16280 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
16290 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
162a0 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
162b0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
162c0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
162d0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
162e0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
162f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
16300 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
16310 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
16320 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
16330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16350 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16360 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16370 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
16380 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
16390 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
163a0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
163b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
163c0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
163d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
163e0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
163f0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
16400 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
16410 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
16420 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
16430 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
16440 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
16450 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16460 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16470 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16480 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16490 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
164a0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
164b0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
164c0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
164d0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
164e0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
164f0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
16500 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
16510 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
16520 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
16530 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
16540 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
16550 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16560 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
16570 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
16580 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
16590 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
165a0 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
165b0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
165c0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
165d0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
165e0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
165f0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
16600 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
16610 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
16620 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
16630 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
16640 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16660 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
16670 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
16680 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
166a0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
166b0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
166c0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
166d0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
166e0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
166f0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
16700 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
16710 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16720 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
16730 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
16740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16750 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
16760 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
16770 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
16780 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
16790 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
167a0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
167b0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
167c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
167d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
167e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
167f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16800 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
16810 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
16820 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
16830 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
16840 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
16850 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
16860 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
16870 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
16880 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
16890 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
168a0 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
168b0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
168c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
168d0 73 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a  stPg, &pPg, 0);.
168e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
168f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16900 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16930 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
16940 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
16950 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16960 67 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  g);.        if( 
16970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16980 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16990 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
169a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c        }.      iL
169b0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20  astPg--;.    }. 
169c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
169d0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
169e0 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50  ->pPager, iLastP
169f0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
16a00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16a10 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
16a20 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
16a30 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
16a40 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
16a50 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
16a60 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
16a70 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
16a80 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
16a90 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
16aa0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
16ab0 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
16ac0 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
16ad0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
16ae0 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
16af0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
16b00 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
16b10 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
16b20 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
16b30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16b40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
16b50 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16b60 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
16b70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
16b80 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
16b90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
16ba0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16bb0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
16bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16bd0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
16be0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
16bf0 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
16c00 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
16c10 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
16c20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16c40 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
16c50 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
16c60 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
16c70 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63  t);.    rc = inc
16c80 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
16c90 20 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75   0, pagerPagecou
16ca0 6e 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20  nt(pBt));.  }.  
16cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
16ce0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
16cf0 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
16d00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
16d10 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
16d20 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64  n.** is commited
16d30 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
16d40 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
16d50 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
16d60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
16d70 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
16d80 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
16d90 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
16da0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
16db0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
16dc0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
16dd0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
16de0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
16df0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
16e00 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
16e10 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
16e20 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
16e30 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
16e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
16e50 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
16e60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
16e70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16e80 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
16e90 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
16ea0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
16eb0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
16ec0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
16ed0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
16ee0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16ef0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16f00 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
16f10 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
16f20 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
16f30 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
16f40 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
16f50 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
16f60 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
16f70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16f80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
16f90 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
16fa0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
16fb0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
16fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16fd0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
16fe0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
16ff0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  y */.    Pgno nP
17000 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e  trmap;      /* N
17010 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
17020 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
17030 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  d */.    Pgno iF
17040 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
17050 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
17060 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
17070 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20  int nEntry;     
17080 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17090 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
170a0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
170b0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
170c0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
170d0 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
170e0 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
170f0 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ig = pagerPageco
17100 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
17110 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
17120 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
17130 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
17140 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
17150 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
17160 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
17170 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
17180 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
17190 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
171a0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
171b0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
171c0 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
171d0 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
171e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
171f0 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
17200 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
17210 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
17220 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17230 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17240 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
17250 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
17260 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
17270 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79  36]);.    nEntry
17280 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
17290 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61  ze/5;.    nPtrma
172a0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
172b0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
172c0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
172d0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e  y)/nEntry;.    n
172e0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
172f0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
17300 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
17310 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17320 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
17330 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
17340 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
17350 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  --;.    }.    wh
17360 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
17370 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
17380 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
17390 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
173a0 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
173b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69     }.    if( nFi
173c0 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
173d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
173e0 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69  BKPT;..    for(i
173f0 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
17400 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
17410 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
17420 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
17430 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
17440 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a  , nFin, iFree);.
17450 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
17460 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
17470 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
17480 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
17490 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
174a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _OK;.      rc = 
174b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
174c0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
174d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
174e0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
174f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
17500 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
17510 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
17520 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
17530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17540 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
17550 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
17560 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  in);.    }.    i
17570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17580 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17590 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
175a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
175b0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
175c0 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
175d0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
175e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
175f0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
17600 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17610 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
17620 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
17630 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
17640 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
17650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
17660 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
17670 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
17680 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
17690 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
176a0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
176b0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
176c0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
176d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
176e0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
176f0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
17700 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
17710 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
17720 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
17730 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
17740 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
17750 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
17760 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
17770 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
17780 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
17790 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
177a0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
177b0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
177c0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
177d0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
177e0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
177f0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
17800 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
17810 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
17820 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
17830 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
17840 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
17850 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
17860 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17870 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
17880 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
17890 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
178a0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
178b0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
178c0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
178d0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
178e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
178f0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
17900 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
17910 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
17920 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
17930 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
17940 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
17950 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
17960 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
17970 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
17980 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
17990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
179a0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
179b0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
179c0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
179d0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
179e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
179f0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
17a00 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
17a10 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
17a20 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
17a30 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
17a40 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
17a50 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
17a60 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
17a70 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
17a80 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
17a90 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
17aa0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
17ab0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
17ac0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
17ad0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
17ae0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
17af0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
17b00 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
17b10 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
17b20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
17b30 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
17b40 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
17b50 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
17b60 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
17b70 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
17b80 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
17b90 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
17ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17bb0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
17bc0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
17bd0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
17be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17bf0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
17c00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17c10 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
17c20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17c30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
17c40 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
17c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17c60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
17c70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
17c80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
17c90 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
17ca0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
17cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
17cd0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17ce0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17d00 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
17d10 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
17d20 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
17d30 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
17d40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
17d50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17d60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
17d80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
17d90 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
17da0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
17db0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
17dc0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
17dd0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
17de0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
17df0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
17e00 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
17e10 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
17e20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17e30 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
17e40 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Csr;.  assert( s
17e50 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
17e60 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f  Mutex(p) );..  /
17e70 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 63  * Search for a c
17e80 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e 20  ursor held open 
17e90 62 79 20 74 68 69 73 20 62 2d 74 72 65 65 20 63  by this b-tree c
17ea0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f 6e  onnection. If on
17eb0 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20 74  e exists,.  ** t
17ec0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
17ed0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77 6e  ion will be down
17ee0 67 72 61 64 65 64 20 74 6f 20 61 20 72 65 61 64  graded to a read
17ef0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
17f00 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f  n.  ** instead o
17f10 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63 6c  f actually concl
17f20 75 64 65 64 2e 20 41 20 73 75 62 73 65 71 75 65  uded. A subseque
17f30 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69  nt call to Commi
17f40 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20 2a  tPhaseTwo() .  *
17f50 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29 20  * or Rollback() 
17f60 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20  will finish the 
17f70 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17f80 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
17f90 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ase.  */.  for(p
17fa0 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Csr=pBt->pCursor
17fb0 3b 20 70 43 73 72 20 26 26 20 70 43 73 72 2d 3e  ; pCsr && pCsr->
17fc0 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72 3d  pBtree!=p; pCsr=
17fd0 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20  pCsr->pNext);.  
17fe0 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30 20  assert( pCsr==0 
17ff0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  || p->inTrans>TR
18000 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62  ANS_NONE );..  b
18010 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
18020 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20  ent(pBt);.  if( 
18030 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77 6e  pCsr ){.    down
18040 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
18050 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
18060 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
18070 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
18080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
18090 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
180a0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
180b0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
180c0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
180d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
180e0 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
180f0 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
18100 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18110 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
18120 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
18130 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
18140 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
18150 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
18160 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
18170 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
18180 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
18190 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
181a0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
181b0 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
181c0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
181d0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
181e0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
181f0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
18200 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
18210 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
18220 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
18230 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
18240 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
18250 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
18260 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
18270 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
18280 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
18290 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
182a0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
182b0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
182c0 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
182d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
182e0 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
182f0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
18300 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
18310 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
18320 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
18330 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
18340 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
18350 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
18360 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
18370 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18380 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
18390 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
183a0 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
183b0 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
183c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
183d0 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
183e0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
183f0 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
18400 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
18410 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
18420 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
18430 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
18440 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
18450 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
18460 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
18470 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
18480 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
18490 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
184a0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
184b0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
184c0 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
184d0 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
184e0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
184f0 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
18500 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
18510 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
18520 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
18530 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18540 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
18550 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
18560 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
18570 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
18580 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
18590 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
185a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
185b0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
185c0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
185d0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
185e0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
185f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
18600 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18610 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
18620 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
18630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
18640 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
18650 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18660 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18670 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18680 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
18690 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
186a0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
186b0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
186c0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
186d0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
186e0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
186f0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
18700 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
18710 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
18720 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
18730 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
18740 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
18750 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
18760 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
18770 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
18780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18790 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
187a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
187b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
187c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
187d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
187e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
187f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
18800 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18810 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
18820 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
18830 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
18840 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
18850 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
18860 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18870 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
18880 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
18890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
188a0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
188b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
188c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
188d0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
188e0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
188f0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
18900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18910 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
18920 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
18930 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20  tPhaseTwo(p);.  
18940 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18950 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18960 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
18970 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
18980 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18990 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72   of write-cursor
189a0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68  s open on this h
189b0 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66  andle. This is f
189c0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
189d0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
189e0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
189f0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
18a00 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
18a10 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  fined..**.** For
18a20 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
18a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
18a40 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
18a50 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
18a60 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
18a70 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  f writing to the
18a80 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20   databse.  That 
18a90 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72  means the cursor
18aa0 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   was.** original
18ab0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  ly opened for wr
18ac0 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75  iting and the cu
18ad0 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20  rsor has not be 
18ae0 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68  disabled.** by h
18af0 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20  aving its state 
18b00 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f  changed to CURSO
18b10 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74  R_FAULT..*/.stat
18b20 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
18b30 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
18b40 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
18b50 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
18b60 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
18b70 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
18b80 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
18b90 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
18ba0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26  ( pCur->wrFlag &
18bb0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
18bc0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
18bd0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
18be0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
18bf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18c00 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
18c10 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
18c20 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
18c30 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
18c40 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
18c50 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
18c60 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
18c70 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
18c80 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
18c90 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
18ca0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
18cb0 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
18cc0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
18cd0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
18ce0 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
18cf0 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
18d00 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
18d10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
18d20 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
18d30 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
18d40 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
18d50 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
18d60 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
18d70 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
18d80 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
18d90 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
18da0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
18db0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
18dc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
18dd0 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
18de0 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
18df0 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
18e00 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
18e10 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
18e20 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
18e30 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
18e40 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
18e50 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
18e60 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
18e70 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
18e80 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
18e90 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
18ea0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c  Cursor *p;.  sql
18eb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18ec0 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
18ed0 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
18ee0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
18ef0 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
18f00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
18f10 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
18f20 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
18f30 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
18f40 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
18f50 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
18f60 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
18f70 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
18f80 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
18f90 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
18fa0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
18fb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
18fc0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18fd0 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
18fe0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
18ff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
19000 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
19010 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
19020 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
19030 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
19040 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
19050 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
19060 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
19070 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
19080 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
19090 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
190a0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
190b0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
190c0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
190d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
190e0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
190f0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
19100 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
19110 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
19120 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
19130 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
19140 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
19150 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
19160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19170 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
19180 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
19190 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
191a0 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  );.  rc = saveAl
191b0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
191c0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
191d0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
191e0 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
191f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19200 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
19210 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
19220 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
19230 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72  c() error occurr
19240 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a  ed whilst.    **
19250 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
19260 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73  cursor positions
19270 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
19280 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61  automatic rollba
19290 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68  ck (as.    ** th
192a0 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f  e result of a co
192b0 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63  nstraint, malloc
192c0 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f  () failure or IO
192d0 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20   error) then .  
192e0 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d    ** the cache m
192f0 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79  ay be internally
19300 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e   inconsistent (n
19310 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64  ot contain valid
19320 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a   trees) so.    *
19330 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70  * we cannot simp
19340 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  ly return the er
19350 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ror to the calle
19360 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72  r. Instead, abor
19370 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75  t .    ** all qu
19380 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62  eries that may b
19390 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74  e using any of t
193a0 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  he cursors that 
193b0 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a  failed to save..
193c0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
193d0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
193e0 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20  rsors(p, rc);.  
193f0 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  }.#endif.  btree
19400 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
19410 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
19430 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
19440 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
19450 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
19460 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
19470 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
19480 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
19490 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
194a0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
194b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
194c0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
194d0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
194e0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
194f0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
19500 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
19510 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
19520 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
19530 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
19540 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
19550 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
19560 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
19570 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
19580 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
19590 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
195a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
195b0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
195c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
195d0 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43  ert( countWriteC
195e0 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29  ursors(pBt)==0 )
195f0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
19600 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
19610 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
19620 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
19630 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
19640 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19660 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
19670 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
19680 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
19690 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e  nsaction can can
196a0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
196b0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
196c0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
196d0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
196e0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
196f0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
19700 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
19710 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
19720 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
19730 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
19740 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
19750 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
19760 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
19770 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
19780 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
19790 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
197a0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
197b0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
197c0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
197d0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
197e0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
197f0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
19800 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
19810 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
19820 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
19830 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
19840 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
19850 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
19860 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
19870 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
19880 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
19890 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
198a0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
198b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
198c0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
198d0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
198e0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
198f0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
19900 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
19910 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
19920 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
19930 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
19940 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
19950 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
19960 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
19970 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
19980 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
19990 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
199a0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
199b0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
199c0 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
199d0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
199e0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
199f0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
19a00 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
19a10 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
19a20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
19a30 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
19a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19a50 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
19a60 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
19a70 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
19a80 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
19a90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19aa0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19ab0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
19ac0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19ad0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
19ae0 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e  ert( pBt->readOn
19af0 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
19b00 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
19b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
19b20 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
19b30 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69  Savepoint );.  i
19b40 66 28 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72  f( NEVER(p->inTr
19b50 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
19b60 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   || pBt->readOnl
19b70 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
19b80 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a  QLITE_INTERNAL;.
19b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
19ba0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
19bb0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
19bc0 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41  RITE );.    /* A
19bd0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
19be0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
19bf0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
19c00 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
19c10 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67     ** an index g
19c20 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
19c30 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
19c40 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
19c50 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73  ing.    ** SQL s
19c60 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
19c70 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
19c80 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
19c90 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a  lback any.    **
19ca0 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
19cb0 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
19cc0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
19cd0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
19ce0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
19cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19d00 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
19d10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
19d20 61 74 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20  atement);.  }.  
19d30 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19d40 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19d50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
19d60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19d70 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
19d80 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
19d90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
19da0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
19db0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
19dc0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
19dd0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
19de0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
19df0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
19e00 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
19e10 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
19e20 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
19e30 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
19e40 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
19e50 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
19e60 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
19e70 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
19e80 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
19e90 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
19ea0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
19eb0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
19ec0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
19ed0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
19ee0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
19ef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
19f00 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
19f10 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
19f20 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
19f30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
19f40 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
19f50 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
19f60 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
19f70 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
19f80 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
19f90 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
19fa0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
19fb0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
19fc0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
19fd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
19fe0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
19ff0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1a000 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1a010 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1a020 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
1a030 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
1a040 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
1a050 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
1a060 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
1a070 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
1a080 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
1a090 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1a0a0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
1a0b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a0c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a0d0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
1a0e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
1a0f0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
1a100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a110 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1a120 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1a130 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
1a140 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a150 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1a160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1a170 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1a180 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1a190 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1a1a0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1a1b0 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1a1c0 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1a1d0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1a1e0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1a1f0 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1a200 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1a210 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1a220 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1a230 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1a240 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1a250 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1a260 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1a270 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1a280 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1a290 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1a2a0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1a2b0 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1a2c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1a2d0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1a2e0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1a2f0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1a300 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1a310 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1a320 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1a330 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1a340 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1a350 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1a360 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1a370 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1a380 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1a390 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1a3a0 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1a3b0 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1a3c0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1a3d0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1a3e0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1a3f0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1a400 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1a410 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1a420 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1a430 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1a440 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1a450 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1a460 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1a470 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1a480 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1a490 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1a4a0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1a4b0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1a4c0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1a4d0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1a4e0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1a4f0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1a500 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1a510 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1a520 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1a530 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1a540 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1a550 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1a560 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1a570 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1a580 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1a590 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1a5a0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1a5b0 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1a5c0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1a5d0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1a5e0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1a5f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1a600 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1a610 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1a620 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1a630 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1a640 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1a650 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1a660 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1a670 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1a680 29 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  ) bytes of memor
1a690 79 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  y .** pointed to
1a6a0 20 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65   by pCur have be
1a6b0 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65  en zeroed by the
1a6c0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1a6d0 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
1a6e0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a710 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1a720 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1a750 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1a760 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1a770 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1a7a0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1a7b0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1a7c0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1a7d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1a7e0 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
1a7f0 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
1a800 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
1a830 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
1a840 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
1a850 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a870 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
1a880 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  andle */..  asse
1a890 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1a8a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1a8b0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1a8c0 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
1a8d0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66  1 );..  /* The f
1a8e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1a8f0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
1a900 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
1a910 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
1a920 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
1a930 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
1a940 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
1a950 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
1a960 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
1a970 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
1a980 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
1a990 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
1a9a0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
1a9b0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
1a9c0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
1a9d0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
1a9e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1a9f0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
1aa00 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20  , wrFlag+1) );. 
1aa10 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1aa20 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
1aa30 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
1aa40 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
1aa50 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
1aa60 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
1aa70 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
1aa80 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
1aa90 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
1aaa0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
1aab0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1aac0 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
1aad0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1aae0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
1aaf0 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
1ab00 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a  age1->aData );..
1ab10 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c    if( NEVER(wrFl
1ab20 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f  ag && pBt->readO
1ab30 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nly) ){.    retu
1ab40 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1ab50 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
1ab60 61 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72  able==1 && pager
1ab70 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1ab80 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ab90 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
1aba0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1abb0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1abc0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1abd0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1abe0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1abf0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1ac00 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1ac10 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1ac20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1ac30 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1ac40 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1ac50 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1ac60 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1ac70 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1ac80 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1ac90 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1aca0 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
1acb0 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
1acc0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1acd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1ace0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1acf0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1ad00 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1ad10 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1ad20 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1ad30 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1ad40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1ad50 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1ad60 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1ad70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1ad80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ad90 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1add0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae00 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1ae10 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1ae20 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1ae60 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1ae70 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1ae80 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1aea0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1aeb0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1aec0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1aef0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1af00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1af10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1af20 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1af30 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1af40 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1af50 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1af60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1af70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1af80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1af90 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1afa0 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1afb0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1afc0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1afd0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1afe0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1aff0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1b000 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1b010 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1b020 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1b030 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1b040 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1b050 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1b060 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1b070 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1b080 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1b090 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1b0a0 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1b0b0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1b0c0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1b0d0 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  rn sizeof(BtCurs
1b0e0 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  or);.}../*.** Se
1b0f0 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  t the cached row
1b100 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72  id value of ever
1b110 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20  y cursor in the 
1b120 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
1b130 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e  le.** as pCur an
1b140 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d  d having the sam
1b150 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
1b160 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68 65  er as pCur.  The
1b170 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
1b180 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a   to iRowid..**.*
1b190 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20  * Only positive 
1b1a0 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72 65  rowid values are
1b1b0 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69   considered vali
1b1c0 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68 65  d for this cache
1b1d0 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69  ..** The cache i
1b1e0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1b1f0 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e   zero, indicatin
1b200 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63  g an invalid cac
1b210 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77  he..** A btree w
1b220 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69  ill work fine wi
1b230 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  th zero or negat
1b240 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20  ive rowids.  We 
1b250 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63  just cannot.** c
1b260 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67  ache zero or neg
1b270 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68  ative rowids, wh
1b280 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73  ich means tables
1b290 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f   that use zero o
1b2a0 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f  r.** negative ro
1b2b0 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61  wids might run a
1b2c0 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20   little slower. 
1b2d0 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63 65   But in practice
1b2e0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67  , zero.** or neg
1b2f0 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72 65  ative rowids are
1b300 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73   very uncommon s
1b310 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  o this should no
1b320 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
1b330 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1b340 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f 77  treeSetCachedRow
1b350 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1b360 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r, sqlite3_int64
1b370 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75   iRowid){.  BtCu
1b380 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1b390 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72  =pCur->pBt->pCur
1b3a0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1b3b0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1b3c0 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e  pgnoRoot==pCur->
1b3d0 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61  pgnoRoot ) p->ca
1b3e0 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77  chedRowid = iRow
1b3f0 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  id;.  }.  assert
1b400 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  ( pCur->cachedRo
1b410 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d  wid==iRowid );.}
1b420 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b430 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1b440 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75  for the given cu
1b450 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76  rsor.  A negativ
1b460 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74  e or zero.** ret
1b470 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1b480 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f 77  tes that the row
1b490 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76 61  id cache is inva
1b4a0 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
1b4b0 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49  e.** ignored.  I
1b4c0 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  f the rowid cach
1b4d0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  e has never befo
1b4e0 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65  re been set, the
1b4f0 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72  n a.** zero is r
1b500 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69  eturned..*/.sqli
1b510 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1b520 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64 52  3BtreeGetCachedR
1b530 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1b540 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1b550 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1b560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1b570 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1b580 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1b5a0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1b5b0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1b5c0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1b5d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b5e0 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1b5f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1b600 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1b610 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1b620 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1b630 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1b640 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1b650 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1b660 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1b670 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1b680 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1b690 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1b6a0 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1b6b0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1b6c0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1b6d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1b6e0 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1b6f0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1b700 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1b710 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1b720 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1b730 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1b740 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1b750 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b760 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1b770 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1b780 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1b790 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1b7a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1b7b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1b7c0 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1b7d0 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
1b7e0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
1b7f0 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
1b800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b810 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1b820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
1b840 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
1b850 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
1b860 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
1b870 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
1b880 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
1b890 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1b8a0 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
1b8b0 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
1b8c0 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
1b8d0 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
1b8e0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
1b8f0 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
1b900 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1b910 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
1b920 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
1b930 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
1b940 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
1b950 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
1b960 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30  ()..**.** 2007-0
1b970 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20  6-25:  There is 
1b980 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65  a bug in some ve
1b990 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74  rsions of MSVC t
1b9a0 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a  hat cause the.**
1b9b0 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61   compiler to cra
1b9c0 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49  sh when getCellI
1b9d0 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65  nfo() is impleme
1b9e0 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e  nted as a macro.
1b9f0 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
1ba00 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73   a measureable s
1ba10 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74  peed advantage t
1ba20 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72  o using the macr
1ba30 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65  o on gcc.** (whe
1ba40 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20  n less compiler 
1ba50 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69  optimizations li
1ba60 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72  ke -Os or -O0 ar
1ba70 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
1ba80 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f  * compiler is no
1ba90 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76  t doing agressiv
1baa0 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f  e inlining.)  So
1bab0 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66   we use a real f
1bac0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d  unction.** for M
1bad0 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20  SVC and a macro 
1bae0 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65  for everything e
1baf0 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34  lse.  Ticket #24
1bb00 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  57..*/.#ifndef N
1bb10 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
1bb20 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
1bb30 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1bb40 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
1bb50 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
1bb60 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1bb70 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
1bb80 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
1bb90 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
1bba0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1bbb0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
1bbc0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1bbd0 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
1bbe0 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26  assert( memcmp(&
1bbf0 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
1bc00 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
1bc10 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
1bc20 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
1bc30 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
1bc40 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f  dif.#ifdef _MSC_
1bc50 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72  VER.  /* Use a r
1bc60 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  eal function in 
1bc70 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f  MSVC to work aro
1bc80 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74  und bugs in that
1bc90 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20   compiler. */.  
1bca0 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43  static void getC
1bcb0 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72  ellInfo(BtCursor
1bcc0 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28   *pCur){.    if(
1bcd0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1bce0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  e==0 ){.      in
1bcf0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1bd00 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72  iPage;.      btr
1bd10 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1bd20 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1bd30 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1bd40 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1bd50 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  .      pCur->val
1bd60 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
1bd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1bd80 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1bd90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
1bda0 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53  se /* if not _MS
1bdb0 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73  C_VER */.  /* Us
1bdc0 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c  e a macro in all
1bdd0 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73   other compilers
1bde0 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e   so that the fun
1bdf0 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64  ction is inlined
1be00 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43   */.#define getC
1be10 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20  ellInfo(pCur)   
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be50 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d     \.  if( pCur-
1be60 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
1be70 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bea0 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50      \.    int iP
1beb0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1bec0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65       \.    btree
1bf00 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1bf10 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1bf20 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1bf30 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c  ,&pCur->info); \
1bf40 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1bf50 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf90 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20  \.  }else{      
1bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c   \.    assertCel
1bff0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20  lInfo(pCur);    
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
1c040 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23  * _MSC_VER */..#
1c050 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
1c060 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
1c070 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
1c080 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1c090 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
1c0a0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1c0b0 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
1c0c0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
1c0d0 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
1c0e0 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
1c0f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1c100 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
1c110 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
1c120 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
1c130 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
1c140 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
1c150 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
1c160 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
1c170 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c180 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
1c190 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1c1a0 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
1c1b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c1c0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
1c1d0 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
1c1e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
1c1f0 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
1c200 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
1c210 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
1c220 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
1c230 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
1c240 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
1c250 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
1c260 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
1c270 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
1c280 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1c290 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
1c2a0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
1c2b0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
1c2c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
1c2d0 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
1c2e0 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
1c2f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c300 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
1c310 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1c320 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
1c330 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
1c340 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1c350 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
1c360 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1c370 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
1c380 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1c390 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
1c3a0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1c3b0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1c3c0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
1c3d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1c3e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1c3f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1c400 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c410 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1c420 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c430 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69  SOR_VALID );.  i
1c440 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
1c450 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1c460 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b  .    *pSize = 0;
1c470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65  .  }else{.    ge
1c480 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1c490 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  .    *pSize = pC
1c4a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1c4b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1c4c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1c4d0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1c4e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1c4f0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1c500 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1c510 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1c520 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
1c530 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1c540 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
1c550 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
1c560 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
1c570 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
1c580 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
1c590 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
1c5a0 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
1c5b0 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
1c5c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
1c5d0 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
1c5e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
1c5f0 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
1c600 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
1c610 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1c620 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1c630 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
1c640 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
1c650 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
1c660 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
1c670 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
1c680 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
1c690 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
1c6a0 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
1c6b0 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
1c6c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
1c6d0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
1c6e0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
1c6f0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1c700 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c710 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c720 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c730 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c740 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1c750 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
1c760 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61  pCur->info.nData
1c770 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c780 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
1c790 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
1c7a0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
1c7b0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1c7c0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
1c7d0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
1c7e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
1c7f0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
1c800 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
1c810 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
1c820 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
1c830 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
1c840 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
1c850 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
1c860 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
1c870 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
1c880 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
1c890 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
1c8a0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
1c8b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c8c0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
1c8d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1c8e0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1c8f0 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
1c900 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1c910 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
1c920 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
1c930 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
1c940 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
1c950 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
1c960 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1c970 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
1c980 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
1c990 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
1c9a0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
1c9b0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
1c9c0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
1c9d0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
1c9e0 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
1c9f0 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
1ca00 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
1ca10 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
1ca20 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
1ca30 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1ca40 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
1ca50 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
1ca60 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1ca70 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
1ca80 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
1ca90 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
1caa0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
1cab0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
1cac0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
1cad0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
1cae0 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
1caf0 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
1cb00 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
1cb10 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
1cb20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1cb30 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
1cb40 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
1cb50 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
1cb60 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1cb70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1cb80 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1cb90 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cbb0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
1cbc0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
1cbd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
1cbe0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
1cbf0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
1cc00 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
1cc10 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
1cc20 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
1cc30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1cc40 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1cc50 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
1cc60 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
1cc70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1cc80 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1cc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
1cca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ccb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1ccc0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1ccd0 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
1cce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ccf0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1cd00 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
1cd10 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1cd20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1cd30 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
1cd40 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
1cd50 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
1cd60 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
1cd70 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
1cd80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1cd90 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
1cda0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
1cdb0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
1cdc0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
1cdd0 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
1cde0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
1cdf0 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
1ce00 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
1ce10 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1ce20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
1ce30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
1ce40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1ce50 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
1ce60 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
1ce70 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
1ce80 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
1ce90 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1cea0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
1ceb0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
1cec0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ced0 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
1cee0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
1cef0 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
1cf00 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
1cf10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
1cf20 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
1cf30 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
1cf40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1cf50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
1cf60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1cf70 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
1cf80 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
1cf90 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
1cfa0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cfb0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
1cfc0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1cfd0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
1cfe0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
1cff0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
1d000 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d010 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1d020 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
1d030 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
1d040 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1d050 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1d060 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
1d070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d080 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1d090 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d0a0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1d0b0 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1d0c0 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1d0d0 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1d0e0 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1d0f0 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1d100 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1d110 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1d120 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1d130 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1d140 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1d150 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1d160 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1d170 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1d180 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1d190 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1d1a0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1d1b0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1d1c0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1d1d0 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1d1e0 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1d1f0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1d200 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1d210 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1d220 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1d230 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1d240 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1d250 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1d260 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1d270 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1d280 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1d290 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1d2a0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1d2b0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1d2c0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1d2d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1d2e0 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1d2f0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1d300 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1d310 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1d320 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1d330 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1d340 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1d350 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1d360 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1d370 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d380 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1d390 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1d3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d3b0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1d3c0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1d3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d3e0 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1d3f0 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1d400 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1d410 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1d420 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1d430 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1d440 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1d450 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1d460 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1d470 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1d480 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1d490 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1d4a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d4b0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1d4c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d4d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1d4e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1d4f0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1d500 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1d510 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d520 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1d530 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1d540 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1d550 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1d560 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1d570 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1d580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d5a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1d5b0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1d5c0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1d5d0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1d5e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1d5f0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1d600 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1d610 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1d620 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1d630 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1d640 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1d650 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1d660 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1d670 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1d680 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1d690 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1d6a0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1d6b0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1d6c0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1d6d0 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1d6e0 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1d6f0 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1d700 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1d710 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1d720 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
1d730 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
1d740 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
1d750 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
1d760 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
1d770 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1d780 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
1d790 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1d7a0 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1d7b0 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1d7c0 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1d7d0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1d7e0 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1d7f0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1d800 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1d810 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1d820 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1d830 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1d840 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1d850 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1d860 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1d870 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1d880 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1d890 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1d8a0 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1d8b0 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1d8c0 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1d8d0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1d8e0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1d8f0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1d900 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1d910 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1d920 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1d930 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1d940 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1d950 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1d960 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1d970 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1d980 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1d990 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1d9a0 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1d9b0 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1d9c0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1d9d0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1d9e0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d9f0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1da00 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1da10 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1da20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1da30 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1da40 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1da50 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1da60 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1da70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1da80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1da90 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1daa0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1dab0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1dac0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1dad0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1dae0 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1daf0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1db00 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1db10 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1db20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1db30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1db40 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1db50 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1db60 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1db70 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1db80 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1db90 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
1dba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
1dbb0 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
1dbc0 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
1dbd0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1dbe0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1dbf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1dc00 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79  E_OK;.  u32 nKey
1dc10 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
1dc20 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1dc30 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
1dc40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
1dc50 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
1dc60 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
1dc70 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1dc80 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
1dcb0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
1dcc0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1dcd0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
1dce0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1dcf0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1dd00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1dd10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1dd20 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1dd30 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1dd40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1dd50 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
1dd60 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
1dd70 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
1dd80 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72  nfo.pCell + pCur
1dd90 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
1dda0 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d    nKey = (pPage-
1ddb0 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69  >intKey ? 0 : (i
1ddc0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1ddd0 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ey);..  if( NEVE
1dde0 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e  R(offset+amt > n
1ddf0 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  Key+pCur->info.n
1de00 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50  Data) .   || &aP
1de10 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1de20 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
1de30 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
1de40 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a  sableSize].  ){.
1de50 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
1de60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
1de70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
1de80 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
1de90 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
1dea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1deb0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
1dec0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
1ded0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
1dee0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
1def0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
1df00 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
1df10 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
1df20 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
1df30 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
1df40 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
1df50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1df60 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
1df70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
1df80 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
1df90 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
1dfa0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
1dfb0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
1dfc0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
1dfd0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
1dfe0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
1dff0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
1e000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
1e010 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
1e020 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
1e030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e040 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
1e050 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
1e060 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
1e070 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
1e080 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
1e090 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
1e0a0 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
1e0b0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
1e0c0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
1e0d0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1e0e0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
1e0f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e100 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
1e110 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
1e120 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1e130 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
1e140 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
1e150 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
1e160 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
1e170 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
1e180 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
1e190 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
1e1a0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
1e1b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1e1c0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1e1d0 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
1e1e0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1e1f0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
1e200 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
1e210 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
1e220 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
1e230 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
1e240 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
1e250 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
1e260 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
1e270 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
1e280 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
1e290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e2a0 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
1e2b0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
1e2c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1e2d0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
1e2e0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
1e2f0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
1e300 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
1e310 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
1e320 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
1e330 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
1e340 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1e350 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76  sizeof(Pgno)*nOv
1e360 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f  fl);.      /* nO
1e370 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f  vfl is always po
1e380 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20 77  sitive.  If it w
1e390 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50  ere zero, fetchP
1e3a0 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76  ayload would hav
1e3b0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  e.      ** been 
1e3c0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
1e3d0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f  this routine. */
1e3e0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
1e3f0 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75  S(nOvfl) && !pCu
1e400 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1e410 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e420 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1e430 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1e440 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
1e450 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
1e460 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
1e470 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
1e480 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
1e490 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
1e4a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1e4b0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
1e4c0 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
1e4d0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
1e4e0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1e4f0 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65  ow && pCur->aOve
1e500 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
1e510 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
1e520 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
1e530 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
1e540 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1e550 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e560 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
1e570 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
1e580 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1e590 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
1e5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1e5b0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
1e5c0 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64   iIdx++){..#ifnd
1e5d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e5e0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a  NCRBLOB.      /*
1e5f0 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f   If required, po
1e600 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
1e610 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1e620 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  che. */.      if
1e630 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1e640 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  w ){.        ass
1e650 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
1e660 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
1e670 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1e680 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
1e690 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
1e6a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
1e6b0 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
1e6c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
1e6d0 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
1e6e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1e6f0 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
1e700 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
1e710 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
1e720 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
1e730 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
1e740 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e750 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
1e760 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
1e770 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
1e780 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
1e790 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
1e7a0 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
1e7b0 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
1e7c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
1e7d0 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
1e7e0 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
1e7f0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
1e800 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
1e810 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ion..        */.
1e820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e830 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1e840 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
1e850 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1e860 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e870 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  +1] ){.         
1e880 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1e890 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1e8a0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  +1];.        } e
1e8b0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
1e8c0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
1e8d0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
1e8e0 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65  nextPage, 0, &ne
1e8f0 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  xtPage);.       
1e900 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53   offset -= ovflS
1e910 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ize;.      }else
1e920 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65  {.        /* Nee
1e930 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  d to read this p
1e940 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74  age properly. It
1e950 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f   contains some o
1e960 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1e970 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74   range of data t
1e980 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61  hat is being rea
1e990 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72  d (eOp==0) or wr
1e9a0 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a  itten (eOp!=0)..
1e9b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e9c0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
1e9d0 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ge;.        int 
1e9e0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
1e9f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ea00 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
1ea10 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
1ea20 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ea30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1ea50 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
1ea60 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
1ea70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ea80 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1ea90 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
1eaa0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
1eab0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
1eac0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1ead0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
1eae0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
1eaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1eb00 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1eb10 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1eb20 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
1eb30 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
1eb40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1eb50 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
1eb60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  ge);.          o
1eb70 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
1eb80 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
1eb90 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d           pBuf +=
1eba0 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   a;.        }.  
1ebb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1ebc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ebd0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1ebe0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ebf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ec00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ec10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
1ec20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
1ec30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ec40 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1ec50 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1ec60 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1ec70 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1ec80 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1ec90 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1eca0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1ecb0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ecc0 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
1ecd0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1ece0 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69  a valid row.** i
1ecf0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
1ed00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1ed10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
1ed20 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1ed30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1ed40 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
1ed50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1ed60 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
1ed70 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
1ed80 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
1ed90 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
1eda0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1edb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1edc0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1edd0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1ede0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1edf0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ee00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1ee10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ee20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1ee30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ee40 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1ee50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ee60 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1ee70 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1ee80 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1ee90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1eea0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1eeb0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
1eec0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1eed0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
1eee0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
1eef0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
1ef00 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
1ef10 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1ef20 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
1ef30 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
1ef40 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
1ef50 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
1ef60 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
1ef70 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
1ef80 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
1ef90 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1efa0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
1efb0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1efc0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
1efd0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
1efe0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1eff0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
1f000 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
1f010 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
1f020 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
1f030 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1f040 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1f050 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
1f060 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
1f070 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
1f080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f090 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
1f0a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f0b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1f0c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1f0d0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
1f0e0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1f0f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f100 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1f110 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1f120 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1f130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f140 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1f150 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f160 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f170 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1f180 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1f190 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f1a0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
1f1b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1f1c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1f1d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f1e0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1f1f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
1f200 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
1f210 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
1f220 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1f230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f240 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1f250 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1f260 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1f270 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1f280 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1f290 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1f2a0 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1f2b0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1f2c0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1f2d0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1f2e0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1f2f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1f300 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1f310 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1f320 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1f330 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1f340 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1f350 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1f360 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1f370 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1f380 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1f390 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1f3a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1f3b0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1f3c0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1f3d0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1f3e0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1f3f0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1f400 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1f410 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1f420 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1f430 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1f440 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1f450 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1f460 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1f470 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1f480 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1f490 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1f4a0 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1f4b0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1f4c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1f4d0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1f4e0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1f4f0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1f500 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1f510 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1f520 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1f530 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1f540 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1f550 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1f560 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1f570 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1f580 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1f590 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1f5a0 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1f5b0 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1f5c0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1f5d0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1f5e0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f5f0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1f600 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1f610 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f620 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f630 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f640 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f650 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1f660 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1f670 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1f680 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1f690 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1f6a0 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1f6b0 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1f6c0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1f6d0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1f6e0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1f6f0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1f700 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f710 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1f720 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1f730 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1f740 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1f750 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1f760 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1f770 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f780 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f790 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1f7a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f7b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1f7c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f7d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f7f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f800 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1f810 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  l );.  if( NEVER
1f820 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a  (pCur->info.nSiz
1f830 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72  e==0) ){.    btr
1f840 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1f850 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f860 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1f870 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c  dx[pCur->iPage],
1f880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f890 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29      &pCur->info)
1f8a0 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64  ;.  }.  aPayload
1f8b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
1f8c0 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
1f8d0 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
1f8e0 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
1f8f0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1f900 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
1f910 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
1f920 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1f930 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1f940 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
1f950 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1f960 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1f970 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1f980 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
1f990 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1f9a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1f9b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  .    assert( nLo
1f9c0 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d  cal<=nKey );.  }
1f9d0 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61  .  *pAmt = nLoca
1f9e0 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79  l;.  return aPay
1f9f0 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
1fa00 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
1fa10 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
1fa20 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
1fa30 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
1fa40 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
1fa50 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
1fa60 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
1fa70 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
1fa80 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
1fa90 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1faa0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
1fab0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
1fac0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1fad0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
1fae0 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
1faf0 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
1fb00 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
1fb10 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
1fb20 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
1fb30 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
1fb40 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
1fb50 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
1fb60 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
1fb70 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
1fb80 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
1fb90 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
1fba0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
1fbb0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1fbc0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
1fbd0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
1fbe0 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
1fbf0 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
1fc00 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
1fc10 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
1fc20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1fc30 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
1fc40 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
1fc50 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74  BtreeKeyFetch(Bt
1fc60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1fc70 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  t *pAmt){.  cons
1fc80 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20  t void *p = 0;. 
1fc90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fca0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1fcb0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1fcc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1fcd0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1fce0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1fcf0 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65  ( ALWAYS(pCur->e
1fd00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fd10 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  LID) ){.    p = 
1fd20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1fd30 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1fd40 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
1fd50 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73  return p;.}.cons
1fd60 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1fd70 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
1fd80 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1fd90 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73  t *pAmt){.  cons
1fda0 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20  t void *p = 0;. 
1fdb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fdc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1fdd0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1fde0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1fdf0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1fe00 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
1fe10 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65  ( ALWAYS(pCur->e
1fe20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fe30 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  LID) ){.    p = 
1fe40 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1fe50 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1fe60 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
1fe70 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a  return p;.}.../*
1fe80 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1fe90 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
1fea0 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
1feb0 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
1fec0 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
1fed0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1fee0 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
1fef0 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
1ff00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1ff10 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
1ff20 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
1ff30 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
1ff40 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
1ff50 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
1ff60 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
1ff70 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
1ff80 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
1ff90 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
1ffa0 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
1ffb0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
1ffc0 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
1ffd0 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
1ffe0 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
1fff0 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
20000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
20010 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69  32 newPgno){.  i
20020 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d  nt rc;.  int i =
20030 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
20040 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
20050 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20060 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
20070 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20080 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20090 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
200a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
200b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
200c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
200d0 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  ge<BTCURSOR_MAX_
200e0 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70  DEPTH );.  if( p
200f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
20100 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
20110 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
20120 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20130 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
20140 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
20150 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
20160 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20  NewPage);.  if( 
20170 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20180 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
20190 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a  +1] = pNewPage;.
201a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b    pCur->aiIdx[i+
201b0 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  1] = 0;.  pCur->
201c0 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72  iPage++;..  pCur
201d0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
201e0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
201f0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
20200 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
20210 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e   || pNewPage->in
20220 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61  tKey!=pCur->apPa
20230 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[i]->intKey ){
20240 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20250 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
20270 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20280 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
20290 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73   Page pParent is
202a0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f   an internal (no
202b0 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67  n-leaf) tree pag
202c0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
202d0 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61   .** asserts tha
202e0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
202f0 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74  hild is the left
20300 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49  -child if the iI
20310 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e  dx'th.** cell in
20320 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f   page pParent. O
20330 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71  r, if iIdx is eq
20340 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c  ual to the total
20350 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65   number of.** ce
20360 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20  lls in pParent, 
20370 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
20380 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72   iChild is the r
20390 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a  ight-child of.**
203a0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
203b0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
203c0 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50  ParentIndex(MemP
203d0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e  age *pParent, in
203e0 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68  t iIdx, Pgno iCh
203f0 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ild){.  assert( 
20400 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
20410 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
20420 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
20430 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
20440 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
20450 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
20460 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
20470 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
20480 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
20490 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
204a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
204b0 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
204c0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
204d0 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
204e0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
204f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
20500 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
20510 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
20520 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
20530 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
20540 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
20550 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
20560 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
20570 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
20580 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
20590 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
205a0 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
205b0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
205c0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
205d0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
205e0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
205f0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
20600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
20610 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
20620 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
20630 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20640 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20650 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20660 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20670 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
20680 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
20690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
206a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
206b0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
206c0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
206d0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
206e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
206f0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
20700 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
20710 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
20720 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20730 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65  ->pgno.  );.  re
20740 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
20750 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20760 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
20770 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
20780 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20790 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
207a0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
207b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
207c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
207d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
207e0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
207f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
20800 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
20810 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
20820 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
20830 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
20840 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
20850 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
20860 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
20870 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
20880 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
20890 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
208a0 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
208b0 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
208c0 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
208d0 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
208e0 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
208f0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
20900 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
20910 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
20920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
20930 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
20940 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
20950 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
20960 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
20970 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
20980 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
20990 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
209a0 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
209b0 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
209c0 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
209d0 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
209e0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
209f0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
20a00 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
20a10 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
20a20 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
20a30 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
20a40 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
20a50 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
20a60 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
20a70 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
20a80 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
20a90 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
20aa0 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
20ab0 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
20ac0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
20ad0 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
20ae0 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
20af0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
20b00 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
20b10 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
20b20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
20b30 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
20b40 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
20b50 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
20b60 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
20b70 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
20b80 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
20b90 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
20ba0 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
20bb0 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
20bc0 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
20bd0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
20be0 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
20bf0 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
20c00 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
20c10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
20c20 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
20c30 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
20c40 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20c50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
20c60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20c70 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20c80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
20c90 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
20ca0 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
20cb0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
20cc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
20cd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
20ce0 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
20cf0 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
20d00 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
20d10 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
20d20 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
20d30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
20d40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20d50 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
20d60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
20d70 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
20d80 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
20d90 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
20da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
20db0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
20dc0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
20dd0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
20de0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
20df0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
20e00 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
20e10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
20e20 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
20e30 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
20e40 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
20e50 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20e60 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
20e70 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
20e80 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
20e90 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
20ea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
20ec0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
20ed0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
20ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
20ef0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
20f00 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
20f10 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
20f20 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
20f30 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
20f40 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
20f50 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
20f60 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
20f70 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
20f80 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
20f90 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
20fa0 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
20fb0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
20fc0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
20fd0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
20fe0 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
20ff0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
21000 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
21010 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21020 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21030 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
21040 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
21050 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
21060 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
21070 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
21080 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21090 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
210a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
210b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
210c0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
210d0 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
210e0 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
210f0 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
21100 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
21110 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
21120 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
21130 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
21140 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
21150 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
21160 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
21170 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
21180 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
21190 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
211a0 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
211b0 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
211c0 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
211d0 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
211e0 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
211f0 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
21200 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
21210 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
21220 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
21230 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
21240 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
21250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
21260 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
21270 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
21280 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
21290 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
212a0 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
212b0 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
212c0 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
212d0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
212e0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
212f0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
21300 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
21310 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
21320 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
21330 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
21340 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
21350 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
21360 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
21370 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
21380 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21390 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
213a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
213b0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
213c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
213d0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
213e0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
213f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
21400 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
21410 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
21420 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
21430 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
21440 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
21450 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
21460 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
21480 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
21490 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
214a0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
214b0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
214c0 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
214d0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
214e0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
214f0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
21500 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
21510 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
21520 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
21530 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
21540 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
21550 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
21560 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21570 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
21580 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21590 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
215a0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
215b0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
215c0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
215d0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
215e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
215f0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
21600 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
21610 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
21620 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21630 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
21640 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
21650 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
21660 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
21670 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
21680 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
21690 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
216a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
216b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
216c0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
216d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
216e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
216f0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
21700 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
21710 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
21720 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
21730 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
21740 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21750 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
21760 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
21770 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
21780 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
21790 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
217a0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
217b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
217c0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
217d0 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
217e0 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
217f0 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
21800 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
21810 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
21820 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
21830 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
21840 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
21850 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
21860 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
21870 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
21880 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
21890 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
218a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
218b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
218c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
218d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
218e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
218f0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
21900 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21910 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21920 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21930 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21940 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
21950 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
21960 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21970 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21980 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
21990 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
219a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
219b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
219c0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
219d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
219e0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
219f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
21a00 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
21a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
21a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21a30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21a40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
21a50 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
21a60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21a70 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
21a80 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
21a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21aa0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
21ab0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
21ac0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
21ad0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
21ae0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
21af0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
21b00 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
21b10 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
21b20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
21b30 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
21b40 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
21b50 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
21b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21b70 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
21b80 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
21b90 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
21ba0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21bb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21be0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
21bf0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
21c00 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
21c10 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
21c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21c30 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
21c40 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
21c50 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
21c60 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21c70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
21c80 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
21c90 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
21ca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21cb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21cc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21cd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21ce0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
21cf0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
21d00 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
21d10 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
21d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
21d30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
21d40 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
21d50 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
21d60 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
21d70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21d80 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
21d90 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
21da0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
21db0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
21dc0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
21dd0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
21de0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
21df0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
21e00 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
21e10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
21e20 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
21e30 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
21e40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21e50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21e60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21e70 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21e80 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21e90 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
21ea0 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
21eb0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
21ec0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
21ed0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
21ee0 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
21ef0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
21f00 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
21f10 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
21f20 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
21f30 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
21f40 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
21f50 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
21f60 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
21f70 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
21f80 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
21f90 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
21fa0 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
21fb0 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
21fc0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
21fd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21fe0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
21ff0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
22000 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
22010 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22020 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
22030 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22040 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22050 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
22060 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22070 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
22080 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
22090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
220a0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
220b0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
220c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
220d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
220e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
220f0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
22100 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
22110 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22120 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
22130 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
22140 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
22150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
22160 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22170 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
22180 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22190 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
221a0 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
221b0 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
221c0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
221d0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
221e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
221f0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
22200 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
22210 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
22220 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
22230 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
22240 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
22250 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
22260 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
22270 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
22280 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
22290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
222a0 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
222b0 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
222c0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
222d0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
222e0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
222f0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
22300 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
22310 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
22320 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22330 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
22340 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
22350 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
22360 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
22370 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
22380 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
22390 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
223a0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
223b0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
223c0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
223d0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
223e0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
223f0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
22400 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
22410 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
22420 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
22430 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
22440 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
22450 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
22460 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
22470 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
22480 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
22490 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
224a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
224b0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
224c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
224d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
224e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
224f0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
22500 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
22510 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
22520 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
22530 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22540 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
22550 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
22560 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
22570 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
22580 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
22590 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
225a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
225b0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225d0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
225e0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
225f0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
22600 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
22610 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
22620 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
22630 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
22640 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
22650 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
22660 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
22670 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
22680 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
22690 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
226a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
226b0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
226c0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
226d0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
226e0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
226f0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
22700 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
22710 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
22720 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
22730 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
22740 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
22750 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
22760 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
22770 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22790 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
227a0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
227b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
227c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
227d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
227e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
227f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
22800 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
22810 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
22820 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
22830 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
22840 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
22850 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
22860 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
22870 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
22880 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
22890 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
228a0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
228b0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
228c0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
228d0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
228e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
228f0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
22900 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
22910 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
22920 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
22930 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
22940 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
22950 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
22960 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
22970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
22980 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
22990 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
229a0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
229b0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
229c0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
229d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
229e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
229f0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
22a00 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
22a10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22a20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
22a30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22a40 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
22a50 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22a60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22a70 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
22a80 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22a90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22aa0 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Cell>0 || pCur->
22ab0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22ac0 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  NVALID );.  if( 
22ad0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22ae0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
22af0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
22b00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22b10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22b20 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
22b30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22b40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
22b50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22b60 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
22b70 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
22b80 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
22b90 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
22ba0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
22bb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
22bc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22bd0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
22be0 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
22bf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
22c00 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
22c10 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
22c20 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
22c30 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
22c40 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
22c50 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
22c60 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
22c70 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
22c80 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
22c90 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
22ca0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
22cb0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
22cc0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
22cd0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
22ce0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
22cf0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
22d00 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
22d10 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
22d20 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
22d30 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
22d40 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
22d50 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
22d60 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
22d70 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
22d80 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
22d90 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
22da0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
22db0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
22dc0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
22dd0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
22de0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
22df0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
22e00 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
22e10 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
22e20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
22e30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22e40 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
22e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
22e60 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22e70 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
22e80 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
22e90 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
22ea0 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
22eb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22ec0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
22ed0 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
22ee0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
22ef0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
22f20 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
22f30 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
22f40 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
22f50 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22f60 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
22f70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
22f80 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
22f90 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
22fa0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
22fb0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
22fc0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
22fd0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
22fe0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
22ff0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
23000 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
23010 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
23020 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
23030 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
23040 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
23050 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
23060 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
23070 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
23080 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
23090 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
230a0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
230b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
230c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
230d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
230e0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
230f0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
23100 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
23110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
23120 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
23130 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
23140 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
23150 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
23160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
23170 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
23180 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
23190 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e 20  is 32768 bytes. 
231a0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
231b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
231c0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
231d0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
231e0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
231f0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
23200 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d 6f  ** page is at mo
23210 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20 77  st 8198 bytes, w
23220 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f 72  hich may be stor
23230 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
23240 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
23250 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
23260 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
23270 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
23280 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
23290 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
232a0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
232b0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
232c0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
232d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
232e0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
232f0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
23300 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
23310 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
23320 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
23330 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
23340 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
23350 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
23360 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
23370 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
23380 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
23390 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
233a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
233b0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
233c0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
233d0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
233e0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
233f0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
23400 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
23410 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
23420 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
23430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
23440 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
23450 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
23460 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
23470 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
23480 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
23490 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
234a0 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
234b0 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
234c0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
234d0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
234e0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
234f0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
23500 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
23510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
23520 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
23530 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
23540 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
23550 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
23560 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
23570 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
23580 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
23590 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
235a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
235b0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
235c0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
235d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
235e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
235f0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
23600 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
23610 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
23620 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
23630 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
23640 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
23650 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
23660 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
23670 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
23680 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
23690 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
236a0 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
236b0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
236c0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
236d0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
236e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
236f0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
23700 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
23710 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
23720 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
23730 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
23740 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
23750 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
23760 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
23770 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
23780 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
23790 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
237a0 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
237b0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
237c0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
237d0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
237e0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
237f0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
23800 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
23820 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
23830 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
23840 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
23850 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23860 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
23870 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
23880 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
23890 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
238a0 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
238b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
238c0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
238d0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
238e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
238f0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
23900 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
23910 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
23920 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
23930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23940 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
23950 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
23960 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
23970 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
23980 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
23990 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
239a0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
239b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
239c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
239d0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
239e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
239f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
23a00 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23a10 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
23a20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
23a30 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
23a40 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
23a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23a60 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
23a70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
23a80 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
23a90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23aa0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
23ab0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
23ac0 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
23ad0 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
23ae0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
23af0 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
23b00 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
23b10 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
23b20 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
23b30 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
23b40 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
23b50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
23b60 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
23b70 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23b80 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23b90 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
23ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
23bb0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
23bc0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
23bd0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
23be0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
23bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23c00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23c10 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23c20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23c30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
23c40 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
23c50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23c60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
23c70 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
23c80 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
23c90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23ca0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
23cb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23cc0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
23cd0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
23ce0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23cf0 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
23d00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
23d10 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23d20 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
23d30 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
23d40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
23d50 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
23d60 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
23d70 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
23d80 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
23d90 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
23da0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
23db0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
23dc0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
23dd0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
23de0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
23df0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
23e00 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
23e10 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
23e20 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
23e30 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
23e40 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
23e50 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
23e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23e70 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
23e80 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
23e90 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
23ea0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
23eb0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
23ec0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
23ed0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
23ee0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
23ef0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
23f00 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
23f10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
23f20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
23f30 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
23f40 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
23f50 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
23f60 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
23f70 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
23f80 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
23f90 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
23fa0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
23fb0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
23fc0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
23fd0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
23fe0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
23ff0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
24000 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24010 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24020 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
24030 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
24040 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
24050 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
24060 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
24070 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24080 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24090 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
240a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
240b0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
240c0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
240d0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
240e0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
240f0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
24100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24110 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
24130 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
24140 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
24150 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
24160 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
24170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24180 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
24190 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
241a0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
241b0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
241c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
241d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
241e0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
241f0 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
24200 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24210 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24220 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
24230 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24240 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
24250 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24260 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
24270 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
24280 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
24290 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
242a0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
242b0 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
242c0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
242d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
242e0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
242f0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24300 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24310 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24320 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
24330 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24340 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
24350 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
24360 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
24370 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
24380 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24390 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
243a0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
243b0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
243c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
243d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
243e0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
243f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24400 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24410 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24420 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
24430 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24440 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24450 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
24460 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24470 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
24480 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
24490 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
244a0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
244b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
244c0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
244d0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
244e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
244f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24510 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
24520 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
24530 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
24540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24550 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
24560 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
24570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
24580 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
24590 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
245a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
245b0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
245c0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
245d0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
245e0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
245f0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
24600 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
24610 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
24620 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
24630 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
24640 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
24650 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
24660 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
24670 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
24680 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
24690 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
246a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
246b0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
246c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
246d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
246e0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
246f0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
24700 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
24710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24720 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24730 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
24740 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
24750 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24760 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
24770 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
24780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24790 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
247a0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
247b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
247c0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
247d0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
247e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
247f0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
24800 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
24810 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24820 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
24830 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24840 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
24850 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
24860 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
24870 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24880 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24890 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
248a0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
248b0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
248c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
248d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
248e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
248f0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
24900 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24910 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
24920 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
24930 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
24940 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
24950 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
24960 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24970 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24980 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
249a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
249b0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
249c0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
249d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
249e0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
249f0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
24a00 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
24a10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
24a20 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
24a30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24a40 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
24a50 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24a60 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
24a70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24a80 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
24a90 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
24aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
24ad0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
24ae0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
24af0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
24b00 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
24b10 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
24b20 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
24b30 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
24b40 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
24b50 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
24b60 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
24b70 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
24b80 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
24b90 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
24ba0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
24bb0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
24bc0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
24bd0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
24be0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
24bf0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
24c00 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
24c10 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
24c20 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
24c30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24c40 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
24c50 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
24c60 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
24c70 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
24c80 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
24c90 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
24ca0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
24cb0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
24cc0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
24cd0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
24ce0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
24cf0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
24d00 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24d10 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
24d20 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
24d30 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
24d40 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
24d50 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
24d60 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
24d70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
24d80 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
24d90 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
24da0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
24db0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
24dc0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
24dd0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
24de0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
24df0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
24e00 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
24e10 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
24e20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
24e30 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
24e40 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
24e50 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
24e60 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
24e70 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
24e80 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
24e90 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
24ea0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
24eb0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
24ec0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
24ed0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
24ee0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
24ef0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
24f00 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
24f10 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
24f20 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
24f30 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
24f40 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
24f50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
24f60 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
24f70 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
24f80 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
24f90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24fa0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
24fb0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
24fc0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
24fd0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
24fe0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
24ff0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
25000 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
25010 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
25020 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
25030 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
25040 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
25050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25060 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
25070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25080 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
25090 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
250a0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
250b0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
250c0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
250d0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
250e0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
250f0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
25100 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
25110 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
25120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25130 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25140 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
25150 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
25160 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
25170 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
25180 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
25190 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
251a0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
251b0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
251c0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
251d0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
251e0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
251f0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
25200 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
25210 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
25220 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
25230 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
25240 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
25250 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
25260 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
25270 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
25280 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
25290 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
252a0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
252b0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
252c0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
252d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
252e0 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
252f0 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
25300 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
25310 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
25320 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
25330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
25340 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
25350 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
25360 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
25370 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
25380 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25390 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
253a0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
253b0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
253c0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
253d0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
253e0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
253f0 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
25400 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
25410 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
25420 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
25430 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
25440 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
25450 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
25460 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
25470 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
25480 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
25490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
254a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
254b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
254c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
254d0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
254e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
254f0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
25500 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
25510 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
25520 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
25530 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
25540 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
25550 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
25560 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
25570 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
25580 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
25590 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
255a0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
255b0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
255c0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
255d0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
255e0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
255f0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
25600 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25610 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
25620 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
25630 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
25640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25650 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
25660 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
25670 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
25680 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
25690 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
256a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
256b0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
256c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
256d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
256e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
256f0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
25700 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
25710 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
25720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25730 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25740 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
25750 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25760 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25770 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
25780 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25790 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
257a0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
257b0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
257c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
257d0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
257e0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
257f0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
25800 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
25810 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
25820 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
25830 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
25840 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
25850 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
25860 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
25870 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
25880 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
25890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
258a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
258b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
258c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
258d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
258e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
258f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25900 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
25910 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
25920 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
25930 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
25940 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
25950 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
25960 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
25970 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
25980 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
25990 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
259a0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
259b0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
259c0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
259d0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
259e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
259f0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
25a00 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
25a10 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
25a20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
25a30 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
25a40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25a50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
25a60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25a70 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
25a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25a90 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
25aa0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
25ab0 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
25ac0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
25ad0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
25ae0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
25af0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
25b00 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
25b10 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
25b20 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
25b30 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
25b40 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
25b50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
25b60 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
25b70 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
25b80 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
25b90 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
25ba0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
25bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25bc0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
25bd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
25be0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25bf0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25c00 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25c20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
25c30 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
25c40 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25c50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
25c60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25c70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25c80 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
25c90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25ca0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
25cb0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
25cc0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
25cd0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
25ce0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
25cf0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
25d00 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
25d10 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
25d20 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
25d30 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
25d40 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
25d50 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
25d60 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
25d70 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
25d80 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
25d90 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
25da0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
25db0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
25dc0 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
25dd0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
25de0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
25df0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25e00 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
25e10 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
25e20 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
25e30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25e40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
25e60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25e70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
25e80 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
25e90 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
25ea0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
25eb0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
25ec0 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
25ed0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
25ee0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
25ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25f00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
25f10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25f20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
25f30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
25f40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25f50 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
25f60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25f70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25f90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25fa0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
25fb0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
25fc0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25fe0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
25ff0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
26000 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
26010 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
26020 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
26030 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
26040 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
26050 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
26060 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
26070 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
26080 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
26090 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
260a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
260b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
260c0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
260d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
260e0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
260f0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
26100 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
26110 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
26120 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26130 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
26140 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
26150 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26160 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26170 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
26180 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
26190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
261a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
261b0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
261c0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
261d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
261e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
261f0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
26200 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
26210 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26220 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
26230 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
26240 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
26250 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
26260 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
26270 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
26280 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
26290 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
262a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
262b0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
262c0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
262d0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
262e0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
262f0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
26300 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
26310 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
26320 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
26330 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26340 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
26350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
26360 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26370 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26380 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
263a0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
263b0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
263c0 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
263d0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
263e0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
263f0 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
26400 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
26410 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
26420 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
26430 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
26440 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
26450 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
26460 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
26470 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
26480 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
26490 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
264a0 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
264b0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
264c0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
264d0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
264e0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
264f0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
26500 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26510 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26530 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
26540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
26550 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
26560 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
26570 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
26580 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
26590 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
265a0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
265b0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
265c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
265d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
265e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
265f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
26600 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26610 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
26620 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
26630 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
26640 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
26650 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
26660 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
26670 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
26680 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
26690 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
266a0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
266b0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
266c0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
266d0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
266e0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
266f0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
26700 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
26710 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
26720 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
26730 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26740 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
26750 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
26760 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
26770 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
26780 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
26790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
267a0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
267b0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
267c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
267d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
267e0 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ble(pTrunk->pDbP
267f0 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
26800 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
26810 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
26820 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a  t(pBt, *pPgno);.
26830 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
26840 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
26850 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
26860 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
26870 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26890 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
268a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
268b0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
268c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
268d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
268e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
268f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
26900 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
26910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
26930 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
26940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26950 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26960 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
26970 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
26980 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
26990 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
269a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
269b0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
269c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
269d0 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
269e0 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
269f0 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
26a00 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
26a10 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
26a20 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
26a30 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
26a40 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70  + 1;..    if( *p
26a50 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
26a60 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
26a70 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
26a80 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
26a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26aa0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26ab0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26ac0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
26ad0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
26ae0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
26af0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
26b00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
26b10 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
26b20 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
26b30 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
26b40 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
26b50 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
26b60 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
26b70 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
26b80 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
26b90 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
26ba0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
26bb0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
26bc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
26bd0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
26be0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
26bf0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
26c00 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
26c10 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
26c20 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
26c30 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
26c40 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
26c50 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
26c60 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26c70 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
26c80 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
26c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26ca0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
26cb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26cc0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
26cd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
26ce0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
26cf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26d00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26d10 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
26d20 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
26d30 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
26d40 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
26d50 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
26d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
26d70 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
26d80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26d90 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
26da0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
26db0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
26dc0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26dd0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26df0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
26e00 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
26e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
26e30 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
26e40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
26e50 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
26e60 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
26e70 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
26e80 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
26e90 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
26ea0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26eb0 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
26ec0 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
26ed0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
26ee0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
26ef0 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
26f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26f10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
26f20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
26f30 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
26f40 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
26f50 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
26f60 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
26f70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
26f80 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
26f90 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
26fa0 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
26fb0 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
26fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
26fe0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
26ff0 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
27000 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
27010 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
27020 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
27030 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
27040 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
27050 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
27060 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
27070 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
27080 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27090 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
270a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
270b0 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
270c0 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
270d0 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
270e0 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
270f0 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
27100 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
27110 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
27120 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
27130 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
27140 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
27150 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
27160 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
27170 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
27180 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
27190 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
271a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
271b0 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
271c0 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
271d0 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
271e0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
271f0 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
27200 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
27210 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
27220 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
27230 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
27240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27250 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
27260 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
27270 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
272a0 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
272b0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
272c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
272d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
272e0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
272f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27300 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
27310 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
27320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
27330 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
27340 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
27350 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27380 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
27390 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
273b0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
273c0 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
273d0 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
273e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
273f0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
27400 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27410 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
27420 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
27430 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
27440 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
27450 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
27460 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
27470 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
27480 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
27490 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
274a0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
274b0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
274c0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
274d0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
274e0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
274f0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
27500 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27510 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
27520 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
27530 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
27540 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
27550 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27560 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
27570 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
27580 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
27590 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65  nFree+1);..#ifde
275a0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
275b0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
275c0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
275d0 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
275e0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
275f0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
27600 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
27610 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
27620 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
27630 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
27640 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
27650 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
27660 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
27670 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c  Page, 0))).   ||
27680 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20              (rc 
27690 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
276a0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
276b0 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  ge)).  ){.    go
276c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
276d0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50  .  }.  memset(pP
276e0 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
276f0 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
27700 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
27710 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
27720 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
27730 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
27740 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
27750 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
27760 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
27770 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
27780 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
27790 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
277a0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
277b0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
277c0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
277d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
277e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
277f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
27800 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
27810 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
27820 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
27830 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
27840 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
27850 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
27860 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
27870 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
27880 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
27890 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
278a0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
278b0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
278c0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
278d0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
278e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
278f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
27900 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
27910 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
27920 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
27930 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
27940 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
27950 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
27960 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
27970 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
27980 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
27990 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
279a0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
279b0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279d0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
279e0 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
279f0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
27a00 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
27a10 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
27a20 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
27a30 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
27a40 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
27a50 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
27a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27a70 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
27a80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27a90 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
27aa0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
27ab0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
27ac0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 70 42    if( nLeaf > pB
27ad0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
27ae0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
27af0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27b00 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
27b10 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
27b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
27b30 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  eaf<pBt->usableS
27b40 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
27b50 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
27b60 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
27b70 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
27b80 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
27b90 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
27ba0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
27bb0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
27bc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
27bd0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
27be0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
27bf0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
27c00 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
27c10 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
27c20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
27c30 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
27c40 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
27c50 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
27c60 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
27c70 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
27c80 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
27c90 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
27ca0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
27cb0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
27cc0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
27cd0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
27ce0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
27cf0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
27d00 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
27d10 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
27d20 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
27d30 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
27d40 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
27d50 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
27d60 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
27d70 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
27d80 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
27d90 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
27da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
27db0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
27dc0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
27dd0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
27de0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
27df0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
27e00 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
27e10 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
27e20 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
27e30 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
27e40 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
27e50 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
27e60 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
27e70 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
27e80 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
27e90 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
27ea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
27eb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27ec0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
27ed0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
27ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27ef0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
27f00 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
27f10 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
27f20 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
27f30 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
27f40 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
27f50 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge);.#ifndef SQL
27f60 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
27f70 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
27f80 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
27f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
27fa0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
27fb0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
27fc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
27fd0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
27fe0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
27ff0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
28000 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
28010 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
28020 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
28030 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
28040 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
28050 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
28060 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
28070 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
28080 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
28090 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
280a0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
280b0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
280c0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
280d0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
280e0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
280f0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
28100 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
28110 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
28120 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28130 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
28140 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
28150 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
28160 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
28170 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
28180 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
28190 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
281a0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
281b0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
281c0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
281d0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
281e0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
281f0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
28200 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
28210 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
28220 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
28230 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28240 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
28250 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28260 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
28270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28280 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
28290 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
282a0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
282b0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
282c0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
282d0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
282e0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
282f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
28300 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
28310 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
28320 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
28330 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
28340 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
28350 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
28360 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
28370 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
28380 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
28390 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
283a0 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
283b0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
283c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
283d0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
283e0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
283f0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
28400 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
28410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
28420 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
28430 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
28440 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
28450 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
28460 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
28470 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
28480 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
28490 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
284a0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
284b0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
284c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
284d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
284e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
284f0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
28500 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
28510 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
28520 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20  nt nOvfl;.  u16 
28530 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
28540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28550 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
28560 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
28570 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
28580 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
28590 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
285a0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
285b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
285c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
285d0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
285e0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
285f0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
28600 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  g */.  }.  ovflP
28610 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
28620 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
28630 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
28640 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
28650 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
28660 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
28670 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
28680 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
28690 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
286a0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
286b0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
286c0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
286d0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
286e0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
286f0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
28700 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
28710 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
28720 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
28730 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
28740 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72  | ovflPgno>pager
28750 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
28760 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
28770 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
28780 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
28790 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
287a0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
287b0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
287c0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
287d0 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
287e0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
287f0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
28800 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
28810 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
28820 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28830 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
28840 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
28850 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
28860 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
28870 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
28880 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
28890 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
288a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
288b0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
288c0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
288d0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  gno);.    if( pO
288e0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
288f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
28900 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
28910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
28920 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28930 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
28940 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
28950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
28960 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
28970 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
28980 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
28990 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
289a0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
289b0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
289c0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
289d0 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
289e0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
289f0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
28a00 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
28a10 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
28a20 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
28a30 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
28a40 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
28a50 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
28a60 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
28a70 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
28a80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
28a90 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
28aa0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
28ab0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
28ac0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
28ad0 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
28ae0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
28af0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
28b00 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
28b10 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
28b20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
28b30 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
28b40 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
28b50 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
28b60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
28b70 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
28b80 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
28b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28ba0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
28bb0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
28bc0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
28bd0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
28be0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
28bf0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
28c00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
28c10 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
28c20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
28c30 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
28c40 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
28c50 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
28c60 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
28c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c80 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
28c90 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
28ca0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
28cb0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
28cd0 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
28ce0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
28cf0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
28d00 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
28d10 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
28d20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
28d30 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
28d40 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
28d50 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
28d60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
28d70 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
28d80 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
28d90 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
28da0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
28db0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
28dc0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
28dd0 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
28de0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
28df0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28e00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28e10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
28e20 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
28e30 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
28e40 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
28e50 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
28e60 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
28e70 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
28e80 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
28e90 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
28ea0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
28eb0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
28ec0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
28ed0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
28ee0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
28ef0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
28f00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28f10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
28f20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
28f30 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
28f40 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
28f50 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
28f60 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
28f70 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
28f80 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
28f90 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
28fa0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
28fb0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
28fc0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
28fd0 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
28fe0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
28ff0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
29000 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
29010 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
29020 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
29030 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
29040 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
29050 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
29060 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
29070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
29080 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
29090 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
290a0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
290b0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
290c0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
290d0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
290e0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
290f0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
29100 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
29110 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
29120 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
29130 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
29140 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
29150 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
29160 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
29170 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
29180 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29190 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
291a0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
291b0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
291c0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
291d0 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
291e0 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
291f0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
29200 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
29210 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
29220 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
29230 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
29240 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
29250 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
29260 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
29270 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
29280 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
29290 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
292a0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
292b0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
292c0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
292d0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
292e0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
292f0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
29300 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
29310 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
29320 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
29330 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
29340 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
29350 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
29360 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
29370 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
29380 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
29390 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
293a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
293b0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
293c0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
293d0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
293e0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
293f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29400 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29410 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
29420 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
29430 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
29440 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
29450 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
29460 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
29470 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
29480 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
29490 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
294a0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
294b0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
294c0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
294d0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
294e0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
294f0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
29500 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
29510 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
29520 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29530 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
29540 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
29550 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
29560 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
29570 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
29580 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
29590 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
295a0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
295b0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
295c0 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
295d0 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
295e0 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
295f0 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
29600 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
29610 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29620 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
29630 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
29640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
29650 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
29660 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
29670 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
29680 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
29690 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
296a0 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
296b0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
296c0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
296d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
296e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
296f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
29700 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
29710 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
29720 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29730 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
29740 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29750 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
29760 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
29770 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
29780 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
29790 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
297a0 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
297b0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
297c0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
297d0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
297e0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
297f0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
29800 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
29810 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
29820 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
29830 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
29840 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
29850 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
29860 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
29870 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
29880 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
29890 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
298a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
298b0 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
298c0 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
298d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
298e0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
298f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
29900 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29910 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
29920 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
29930 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
29940 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
29950 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
29960 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
29970 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
29980 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
29990 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
299a0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
299b0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
299c0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
299d0 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
299e0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
299f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
29a00 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
29a10 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
29a20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
29a30 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
29a40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
29a50 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
29a60 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
29a70 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
29a80 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
29a90 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
29aa0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
29ab0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
29ac0 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
29ad0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
29ae0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
29af0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
29b00 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
29b10 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
29b20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
29b30 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
29b40 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
29b50 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
29b60 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
29b70 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
29b80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29b90 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
29ba0 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
29bb0 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
29bc0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
29bd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
29be0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29bf0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
29c00 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
29c10 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
29c20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
29c30 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
29c40 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
29c50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
29c60 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
29c70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29c80 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
29c90 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
29ca0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
29cb0 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
29cc0 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
29cd0 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
29ce0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
29cf0 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
29d00 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
29d10 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
29d20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
29d30 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
29d40 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
29d50 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
29d60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29d70 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
29d80 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
29d90 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
29da0 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
29db0 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
29dc0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
29dd0 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
29de0 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
29df0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
29e00 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
29e10 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
29e20 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
29e30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
29e40 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
29e50 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
29e60 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
29e70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
29e80 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
29e90 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
29ea0 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
29eb0 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
29ec0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
29ed0 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
29ee0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
29ef0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
29f00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
29f10 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
29f20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
29f30 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
29f40 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
29f50 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
29f60 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
29f70 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
29f80 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
29f90 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
29fa0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
29fb0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
29fc0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
29fd0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
29fe0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
29ff0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2a000 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2a010 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2a020 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2a030 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2a040 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2a050 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2a060 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2a070 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2a080 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2a090 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a0a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2a0b0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2a0c0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2a0d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a0e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2a0f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2a100 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2a110 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
2a120 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2a130 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
2a140 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2a150 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2a160 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2a170 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2a180 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2a190 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2a1a0 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2a1b0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2a1c0 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2a1d0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2a1e0 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2a1f0 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2a200 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2a210 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2a220 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a230 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2a240 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2a250 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2a260 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2a270 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2a280 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
2a290 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
2a2a0 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
2a2b0 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
2a2c0 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
2a2d0 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
2a2e0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
2a2f0 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
2a300 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2a310 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2a320 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2a330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2a340 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2a350 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2a360 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2a370 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2a380 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2a390 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2a3a0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2a3b0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2a3c0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2a3d0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2a3e0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2a3f0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2a400 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2a410 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2a420 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2a430 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2a440 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2a450 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2a460 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2a470 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
2a480 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2a490 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2a4a0 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2a4b0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2a4c0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2a4d0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2a4e0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2a4f0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2a500 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2a510 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2a520 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2a530 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2a540 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2a550 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2a560 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2a570 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2a580 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2a590 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2a5a0 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2a5b0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2a5c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a5d0 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2a5e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2a5f0 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2a600 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2a610 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2a620 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2a630 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2a640 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2a650 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2a660 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2a670 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2a680 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2a690 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2a6a0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2a6b0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2a6c0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2a6d0 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2a6e0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2a6f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2a700 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2a710 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2a720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2a730 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2a740 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2a750 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2a760 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2a770 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2a780 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2a790 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2a7a0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2a7b0 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2a7c0 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2a7d0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2a7e0 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2a7f0 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2a800 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2a810 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a820 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f   idx;          /
2a830 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2a840 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2a850 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2a860 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2a870 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2a880 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2a890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2a8a0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2a8b0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2a8c0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2a8d0 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2a8e0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2a8f0 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2a900 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2a910 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2a920 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2a930 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2a940 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2a950 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2a960 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2a970 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2a980 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2a990 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
2a9a0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
2a9b0 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
2a9c0 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
2a9d0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
2a9e0 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43   int nSkip = (iC
2a9f0 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a  hild ? 4 : 0);..
2aa00 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2aa10 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2aa20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
2aa30 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
2aa40 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
2aa50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2aa60 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2aa70 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2aa80 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2aa90 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
2aaa0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2aab0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
2aac0 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20  age->aOvfl) );. 
2aad0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2aae0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2aaf0 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65  pCell) );.  asse
2ab00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ab10 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ab20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
2ab30 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2ab40 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
2ab50 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
2ab60 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
2ab70 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
2ab80 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
2ab90 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2aba0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
2abb0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
2abc0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2abd0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
2abe0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2abf0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
2ac00 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
2ac10 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
2ac20 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
2ac30 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
2ac40 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
2ac50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
2ac60 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
2ac70 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
2ac80 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
2ac90 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  u16)i;.  }else{.
2aca0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2acb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2acc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2acd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ace0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2acf0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2ad00 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2ad10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ad20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ad30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2ad40 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
2ad50 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2ad60 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
2ad70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2ad80 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
2ad90 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
2ada0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73  ->nCell;.    ins
2adb0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2adc0 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  2*i;.    rc = al
2add0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
2ade0 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
2adf0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
2ae00 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
2ae10 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
2ae20 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
2ae30 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
2ae40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2ae50 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
2ae60 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
2ae70 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   success */.    
2ae80 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65  assert( idx >= e
2ae90 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  nd+2 );.    asse
2aea0 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50  rt( idx+sz <= pP
2aeb0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2aec0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
2aed0 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
2aee0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
2aef0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
2af00 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2af10 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
2af20 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2af30 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
2af40 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2af50 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
2af60 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2af70 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70      for(j=end, p
2af80 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69  tr=&data[j]; j>i
2af90 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32  ns; j-=2, ptr-=2
2afa0 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20  ){.      ptr[0] 
2afb0 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  = ptr[-2];.     
2afc0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31   ptr[1] = ptr[-1
2afd0 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  ];.    }.    put
2afe0 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2aff0 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2b000 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2b010 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2b020 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2b030 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b040 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2b050 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2b060 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2b070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2b080 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2b090 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2b0a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2b0b0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2b0c0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2b0d0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2b0e0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2b0f0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2b100 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2b110 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2b120 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2b130 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2b140 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2b150 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2b160 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2b170 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2b180 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2b190 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2b1a0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2b1b0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2b1c0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2b1d0 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2b1e0 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2b1f0 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2b200 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2b210 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2b220 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2b230 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2b240 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2b250 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2b260 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2b270 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2b280 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2b290 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2b2a0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2b2b0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2b2c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2b2d0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2b2e0 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2b2f0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2b300 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2b310 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2b320 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2b330 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2b340 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2b350 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2b360 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2b370 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2b380 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2b390 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2b3a0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2b3b0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2b3c0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2b3d0 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2b3e0 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2b3f0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2b400 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2b410 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2b420 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2b430 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2b440 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2b450 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b460 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2b470 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2b480 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2b490 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28   nCell<=MX_CELL(
2b4a0 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d  pPage->pBt) && M
2b4b0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2b4c0 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73  t)<=5460 );.  as
2b4d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2b4e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2b4f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2b500 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
2b510 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a  t the page has j
2b520 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ust been zeroed 
2b530 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f  by zeroPage() */
2b540 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b550 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2b560 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2b570 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d  (&data[hdr+5])==
2b580 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43  nUsable );..  pC
2b590 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70  ellptr = &data[p
2b5a0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2b5b0 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63   + nCell*2];.  c
2b5c0 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c  ellbody = nUsabl
2b5d0 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c  e;.  for(i=nCell
2b5e0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
2b5f0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
2b600 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
2b610 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  -= aSize[i];.   
2b620 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
2b630 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
2b640 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2b650 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
2b660 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b  l[i], aSize[i]);
2b670 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2b680 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2b690 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2b6a0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2b6b0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2b6c0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2b6d0 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2b6e0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2b6f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2b700 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2b710 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2b720 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2b730 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2b740 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2b750 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2b760 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2b770 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2b780 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2b790 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2b7a0 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2b7b0 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2b7c0 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2b7d0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2b7e0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2b7f0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2b800 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2b810 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2b820 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2b830 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2b840 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2b850 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2b860 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2b870 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2b880 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2b890 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2b8a0 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2b8b0 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2b8c0 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2b8d0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2b8e0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2b8f0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2b900 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2b910 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2b920 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2b930 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2b940 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2b950 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2b960 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2b970 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2b980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b990 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2b9a0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2b9b0 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2b9c0 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2b9d0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2b9e0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2b9f0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2ba00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ba10 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2ba20 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2ba30 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2ba40 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2ba50 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2ba60 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2ba70 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2ba80 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2ba90 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2baa0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2bab0 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2bac0 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2bad0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2bae0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2baf0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2bb00 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2bb10 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
2bb20 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
2bb30 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
2bb40 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
2bb50 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2bb60 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2bb70 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
2bb80 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
2bb90 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
2bba0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
2bbb0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
2bbc0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
2bbd0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
2bbe0 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
2bbf0 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
2bc00 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
2bc10 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2bc20 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
2bc30 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
2bc40 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
2bc50 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
2bc60 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
2bc70 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
2bc80 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2bc90 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2bca0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
2bcb0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
2bcc0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
2bcd0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
2bce0 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
2bcf0 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
2bd00 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
2bd10 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
2bd20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2bd30 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
2bd40 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
2bd50 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
2bd60 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
2bd70 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
2bd80 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2bd90 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
2bda0 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
2bdb0 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
2bdc0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
2bdd0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
2bde0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2bdf0 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
2be00 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
2be10 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
2be20 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2be30 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
2be40 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
2be50 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2be60 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
2be70 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
2be80 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
2be90 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
2bea0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
2beb0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
2bec0 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
2bed0 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
2bee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
2bef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bf00 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
2bf10 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2bf20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2bf50 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
2bf60 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2bf90 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
2bfa0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2bfb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2bfc0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2bfd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bfe0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bff0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2c000 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2c010 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2c020 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ow==1 );..  if( 
2c030 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
2c040 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2c050 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
2c060 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
2c070 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
2c080 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
2c090 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
2c0a0 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
2c0b0 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
2c0c0 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
2c0d0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
2c0e0 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
2c0f0 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
2c100 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
2c110 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2c120 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
2c130 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
2c140 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c150 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
2c160 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
2c170 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c180 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
2c190 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
2c1a0 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
2c1b0 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c  l = pPage->aOvfl
2c1c0 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75  [0].pCell;.    u
2c1d0 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
2c1e0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2c1f0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
2c200 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
2c210 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2c220 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
2c230 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2c240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c250 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
2c260 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2c270 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
2c280 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
2c290 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
2c2a0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2c2b0 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
2c2c0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
2c2d0 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
2c2e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2c2f0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2c300 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2c310 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2c320 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
2c330 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
2c340 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
2c350 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
2c360 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
2c370 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
2c380 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2c390 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
2c3a0 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
2c3b0 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
2c3c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
2c3d0 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
2c3e0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
2c3f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c400 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
2c410 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
2c420 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
2c430 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
2c440 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
2c450 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
2c460 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
2c470 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
2c480 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
2c490 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
2c4a0 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
2c4b0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
2c4c0 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
2c4d0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
2c4e0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2c4f0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2c500 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
2c510 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2c520 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
2c530 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2c540 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
2c550 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
2c560 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
2c570 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
2c580 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
2c590 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
2c5a0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2c5b0 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
2c5c0 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
2c5d0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
2c5e0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
2c5f0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
2c600 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
2c610 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
2c620 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
2c630 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
2c640 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2c650 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
2c660 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
2c670 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
2c680 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
2c690 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
2c6a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
2c6b0 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
2c6c0 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
2c6d0 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
2c6e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
2c6f0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2c700 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
2c710 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
2c720 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
2c730 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
2c740 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
2c750 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
2c760 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
2c770 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
2c780 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
2c790 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2c7a0 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
2c7b0 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
2c7c0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
2c7d0 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
2c7e0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
2c7f0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
2c800 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
2c810 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
2c820 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
2c830 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
2c840 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
2c850 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
2c860 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
2c870 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2c880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
2c890 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2c8a0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
2c8b0 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
2c8c0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2c8d0 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
2c8e0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
2c8f0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
2c900 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2c910 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
2c920 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
2c930 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
2c940 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
2c950 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
2c960 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2c970 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
2c980 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
2c990 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
2c9a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
2c9b0 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
2c9c0 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
2c9d0 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
2c9e0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
2c9f0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
2ca00 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
2ca10 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
2ca20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
2ca30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
2ca40 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
2ca50 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2ca60 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
2ca70 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
2ca80 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
2ca90 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
2caa0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2cab0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
2cac0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2cad0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
2cae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2caf0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
2cb00 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
2cb10 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2cb20 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
2cb30 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
2cb40 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
2cb50 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
2cb60 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
2cb70 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
2cb80 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
2cb90 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
2cba0 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
2cbb0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
2cbc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
2cbd0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
2cbe0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
2cbf0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
2cc00 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
2cc10 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
2cc20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
2cc30 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
2cc40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
2cc50 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
2cc60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2cc70 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
2cc80 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2cc90 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
2cca0 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
2ccb0 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
2ccc0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2ccd0 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
2cce0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
2ccf0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
2cd00 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
2cd10 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
2cd20 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
2cd30 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
2cd40 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
2cd50 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
2cd60 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
2cd70 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
2cd80 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
2cd90 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
2cda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2cdb0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2cdc0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
2cdd0 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
2cde0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2cdf0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2ce00 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2ce10 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
2ce20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2ce30 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2ce40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ce50 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2ce60 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2ce70 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
2ce80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
2ce90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2cea0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2ceb0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2cec0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2ced0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2cee0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2cef0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
2cf00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2cf10 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2cf20 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2cf30 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
2cf40 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2cf50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
2cf60 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2cf70 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
2cf80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
2cf90 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
2cfa0 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
2cfb0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
2cfc0 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
2cfd0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
2cfe0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
2cff0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2d000 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
2d010 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
2d020 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
2d030 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
2d040 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
2d050 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
2d060 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
2d070 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
2d080 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
2d090 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
2d0a0 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
2d0b0 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
2d0c0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
2d0d0 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
2d0e0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
2d0f0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
2d100 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
2d110 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
2d120 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
2d130 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
2d140 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
2d150 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20  MemPage.aOvfl[] 
2d160 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72 65  array), they are
2d170 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70   not copied to p
2d180 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  To. .**.** Befor
2d190 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67  e returning, pag
2d1a0 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69  e pTo is reiniti
2d1b0 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72  alized using btr
2d1c0 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
2d1d0 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61  .** The performa
2d1e0 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  nce of this func
2d1f0 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74  tion is not crit
2d200 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79  ical. It is only
2d210 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65   used by .** the
2d220 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2d230 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65  er() and balance
2d240 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64  _deeper() proced
2d250 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66  ures, neither of
2d260 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61  .** which are ca
2d270 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72  lled often under
2d280 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74   normal circumst
2d290 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ances..*/.static
2d2a0 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f   void copyNodeCo
2d2b0 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
2d2c0 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
2d2d0 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  To, int *pRC){. 
2d2e0 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
2d2f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74  ITE_OK ){.    Bt
2d300 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70  Shared * const p
2d310 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  Bt = pFrom->pBt;
2d320 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2d330 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
2d340 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63  Data;.    u8 * c
2d350 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
2d360 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63  aData;.    int c
2d370 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20  onst iFromHdr = 
2d380 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74  pFrom->hdrOffset
2d390 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2d3a0 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e  iToHdr = ((pTo->
2d3b0 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a  pgno==1) ? 100 :
2d3c0 20 30 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c   0);.    TESTONL
2d3d0 59 28 69 6e 74 20 72 63 3b 29 0a 20 20 20 20 69  Y(int rc;).    i
2d3e0 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a  nt iData;.  .  .
2d3f0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
2d400 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  m->isInit );.   
2d410 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2d420 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b  nFree>=iToHdr );
2d430 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2d440 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2d450 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2d460 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2d470 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
2d480 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2d490 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2d4a0 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2d4b0 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
2d4c0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2d4d0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2d4e0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2d4f0 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
2d500 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
2d510 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
2d520 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
2d530 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
2d540 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
2d550 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2d560 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
2d570 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
2d580 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2d590 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2d5a0 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2d5b0 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
2d5c0 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2d5d0 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2d5e0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2d5f0 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20   "cannot" fail, 
2d600 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  as the.    ** da
2d610 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70  ta copied from p
2d620 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  From is known to
2d630 20 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20   be valid.  */. 
2d640 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
2d650 20 30 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59   0;.    TESTONLY
2d660 28 72 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69  (rc = ) btreeIni
2d670 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
2d680 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2d690 54 45 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20  TE_OK );.  .    
2d6a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2d6b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2d6c0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2d6d0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2d6e0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
2d6f0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
2d700 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
2d710 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
2d720 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
2d730 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
2d740 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2d750 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2d760 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
2d770 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
2d780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2d790 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
2d7a0 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
2d7b0 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
2d7c0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2d7d0 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
2d7e0 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
2d7f0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
2d800 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
2d810 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
2d820 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
2d830 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
2d840 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
2d850 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
2d860 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
2d870 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
2d880 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
2d890 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
2d8a0 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
2d8b0 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
2d8c0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
2d8d0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
2d8e0 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
2d8f0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
2d900 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
2d910 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
2d920 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
2d930 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
2d940 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
2d950 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
2d960 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
2d970 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
2d980 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
2d990 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
2d9a0 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2d9b0 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
2d9c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
2d9d0 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
2d9e0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
2d9f0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
2da00 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
2da10 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
2da20 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
2da30 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
2da40 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
2da50 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2da60 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2da70 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2da80 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
2da90 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
2daa0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
2dab0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
2dac0 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
2dad0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
2dae0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2daf0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
2db00 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
2db10 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
2db20 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
2db30 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2db40 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
2db50 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2db60 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2db70 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
2db80 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
2db90 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
2dba0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
2dbb0 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
2dbc0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
2dbd0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2dbe0 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
2dbf0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
2dc00 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
2dc10 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
2dc20 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
2dc30 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
2dc40 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
2dc50 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
2dc60 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2dc70 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
2dc80 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
2dc90 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
2dca0 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
2dcb0 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
2dcc0 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
2dcd0 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
2dce0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
2dcf0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
2dd00 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
2dd10 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
2dd20 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
2dd30 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
2dd40 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
2dd50 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
2dd60 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
2dd70 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2dd80 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2dd90 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2dda0 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
2ddb0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2ddc0 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
2ddd0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
2dde0 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
2ddf0 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
2de00 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2de10 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
2de20 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
2de30 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
2de40 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
2de50 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
2de60 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
2de70 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
2de80 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
2de90 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
2dea0 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
2deb0 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
2dec0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2ded0 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
2dee0 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
2def0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
2df00 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
2df10 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
2df20 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
2df30 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
2df40 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
2df50 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
2df60 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2df70 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
2df80 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
2df90 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
2dfa0 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
2dfb0 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
2dfc0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2dfd0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2dfe0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2dff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e000 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2e010 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2e020 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
2e030 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2e040 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
2e050 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2e060 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
2e070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e080 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
2e090 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
2e0a0 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
2e0b0 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
2e0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
2e0d0 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
2e0e0 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
2e0f0 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
2e100 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
2e110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2e120 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
2e130 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
2e140 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2e150 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e160 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
2e170 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
2e180 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
2e190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e1a0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
2e1b0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
2e1c0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
2e1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2e1e0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
2e1f0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
2e200 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
2e210 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
2e220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e230 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2e240 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
2e250 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2e260 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e270 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2e280 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
2e290 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
2e2a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e2b0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2e2c0 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
2e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2e2e0 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
2e2f0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2e300 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
2e310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2e330 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
2e340 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
2e350 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
2e360 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2e370 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
2e380 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
2e3b0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
2e3c0 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
2e3d0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
2e3e0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2e3f0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
2e400 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
2e410 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
2e420 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
2e430 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2e440 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
2e450 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
2e460 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2e470 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
2e480 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
2e490 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
2e4a0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
2e4b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e4c0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2e4d0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
2e4e0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
2e4f0 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
2e500 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2e510 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
2e520 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
2e530 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
2e540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2e550 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
2e560 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
2e570 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
2e580 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
2e590 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2e5a0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
2e5b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2e5c0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
2e5d0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
2e5e0 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
2e5f0 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
2e600 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
2e610 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2e620 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
2e630 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
2e640 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
2e650 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
2e660 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2e670 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
2e680 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
2e690 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
2e6a0 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
2e6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2e6c0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2e6d0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2e6e0 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2e6f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2e700 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2e710 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2e720 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2e730 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2e740 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2e750 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2e760 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2e770 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2e780 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2e790 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2e7a0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2e7b0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2e7c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e7d0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2e7e0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2e7f0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2e800 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2e810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2e820 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
2e830 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
2e840 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2e850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e860 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
2e870 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
2e880 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
2e890 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
2e8a0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2e8b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2e8c0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2e8d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e8e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e8f0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2e900 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
2e910 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2e920 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2e930 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2e940 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2e950 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
2e960 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
2e970 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
2e980 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
2e990 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
2e9a0 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
2e9b0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
2e9c0 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
2e9d0 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
2e9e0 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
2e9f0 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
2ea00 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
2ea10 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
2ea20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
2ea30 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
2ea40 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
2ea50 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2ea60 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
2ea70 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
2ea80 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
2ea90 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2eaa0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2eab0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2eac0 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2ead0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
2eae0 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
2eaf0 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
2eb00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2eb10 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2eb20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
2eb30 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2eb40 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
2eb50 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
2eb60 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
2eb70 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
2eb80 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
2eb90 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2eba0 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
2ebb0 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
2ebc0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
2ebd0 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
2ebe0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
2ebf0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
2ec00 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
2ec10 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
2ec20 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
2ec30 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
2ec40 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
2ec50 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
2ec60 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
2ec70 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
2ec80 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
2ec90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2eca0 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
2ecb0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2ecc0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2ecd0 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
2ece0 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
2ecf0 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
2ed00 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
2ed10 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
2ed20 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
2ed30 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
2ed40 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65  rent page, since
2ed50 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20   if any existed 
2ed60 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  they will.  ** h
2ed70 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2ed80 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
2ed90 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
2eda0 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
2edb0 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
2edc0 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
2edd0 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
2ede0 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
2edf0 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
2ee00 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2ee10 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
2ee20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
2ee30 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
2ee40 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
2ee50 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
2ee60 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
2ee70 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
2ee80 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
2ee90 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
2eea0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
2eeb0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2eec0 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
2eed0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2eee0 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
2eef0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2ef00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
2ef10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
2ef20 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
2ef30 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2ef40 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ef50 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
2ef60 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
2ef70 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
2ef80 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
2ef90 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2efa0 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
2efb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2efc0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
2efd0 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
2efe0 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
2eff0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2f000 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2f010 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
2f020 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
2f030 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
2f040 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
2f050 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
2f060 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
2f070 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f  Div==pParent->aO
2f080 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50  vfl[0].idx && pP
2f090 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2f0a0 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2f0b0 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
2f0c0 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2f0d0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2f0e0 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2f0f0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
2f100 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2f110 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2f120 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
2f130 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2f140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2f150 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2f160 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2f170 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2f180 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
2f190 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2f1a0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2f1b0 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2f1c0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2f1d0 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
2f1e0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
2f1f0 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
2f200 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
2f210 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
2f220 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
2f230 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
2f240 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
2f250 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
2f260 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
2f270 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
2f280 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
2f290 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
2f2a0 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
2f2b0 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2f2c0 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
2f2d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2f2e0 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
2f2f0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
2f300 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
2f310 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
2f320 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
2f330 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
2f340 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
2f350 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2f360 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65  ** Unless SQLite
2f370 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2f380 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2f390 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2f3a0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
2f3b0 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
2f3c0 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
2f3d0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2f3e0 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
2f3f0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2f400 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
2f410 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
2f420 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
2f430 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
2f440 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
2f450 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
2f460 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
2f470 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
2f480 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
2f490 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64  ocated.  */.#ifd
2f4a0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
2f4b0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65  _DELETE.      me
2f4c0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
2f4d0 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
2f4e0 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76  t->aData], apDiv
2f4f0 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
2f500 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2f510 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44   &aOvflSpace[apD
2f520 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2f530 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20  Data];.#endif.  
2f540 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2f550 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
2f560 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2f570 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29  , szNew[i], &rc)
2f580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2f590 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
2f5a0 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
2f5b0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
2f5c0 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
2f5d0 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
2f5e0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
2f5f0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
2f600 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
2f610 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
2f620 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
2f630 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d  .  */.  k = pBt-
2f640 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e  >pageSize + ROUN
2f650 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
2f660 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68  e));.  szScratch
2f670 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
2f680 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
2f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6a0 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
2f6b0 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
2f6c0 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
2f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6e0 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
2f6f0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
2f700 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
2f730 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c   */.     + k*nOl
2f740 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
2f770 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a  opies (apCopy) *
2f780 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
2f790 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
2f7a0 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
2f7b0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
2f7c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2f7d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
2f7e0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2f7f0 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
2f800 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
2f810 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
2f820 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26  aSpace1 = (u8*)&
2f830 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
2f840 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
2f850 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2f860 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20  T(aSpace1) );.. 
2f870 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
2f880 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
2f890 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
2f8a0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
2f8b0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
2f8c0 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
2f8d0 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
2f8e0 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
2f8f0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2f900 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
2f910 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
2f920 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
2f930 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
2f940 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
2f950 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
2f960 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
2f970 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
2f980 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
2f990 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
2f9a0 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
2f9b0 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
2f9c0 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
2f9d0 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
2f9e0 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
2f9f0 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
2fa00 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
2fa10 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2fa20 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
2fa30 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
2fa40 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
2fa50 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
2fa60 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
2fa70 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
2fa80 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
2fa90 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
2faa0 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
2fab0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
2fac0 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
2fad0 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
2fae0 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
2faf0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2fb00 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
2fb10 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
2fb20 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
2fb30 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
2fb40 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
2fb50 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
2fb60 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
2fb70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
2fb80 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a   apOld[0]->leaf*
2fb90 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
2fba0 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74  apOld[0]->hasDat
2fbb0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
2fbc0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2fbd0 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
2fbe0 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
2fbf0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
2fc00 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
2fc10 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
2fc20 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
2fc30 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
2fc40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
2fc50 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
2fc60 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
2fc70 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
2fc80 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
2fc90 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
2fca0 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
2fcb0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
2fcc0 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
2fcd0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
2fce0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
2fcf0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
2fd00 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
2fd10 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
2fd20 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
2fd30 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
2fd40 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
2fd50 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
2fd60 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
2fd70 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
2fd80 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
2fd90 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
2fda0 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
2fdb0 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
2fdc0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
2fdd0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
2fde0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
2fdf0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
2fe00 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
2fe10 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2fe20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
2fe30 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
2fe40 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
2fe50 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
2fe60 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
2fe70 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
2fe80 5d 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ]);.      nCell+
2fe90 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
2fea0 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
2feb0 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
2fec0 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
2fed0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
2fee0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
2fef0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2ff00 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
2ff10 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
2ff20 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
2ff30 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
2ff40 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
2ff50 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
2ff60 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2ff70 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2ff80 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
2ff90 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce1<=pBt->pageSi
2ffa0 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
2ffb0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
2ffc0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
2ffd0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
2ffe0 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
2fff0 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
30000 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
30010 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
30020 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
30030 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
30040 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
30050 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
30060 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
30070 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
30080 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
30090 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
300a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
300b0 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
300c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
300d0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
300e0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
300f0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
30100 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
30110 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
30120 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
30130 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
30140 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
30150 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
30160 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
30170 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
30180 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
30190 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
301a0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
301b0 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
301c0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
301d0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
301e0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
301f0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
30200 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
30210 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
30220 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
30230 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
30240 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
30250 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
30260 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
30270 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
30280 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
30290 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
302a0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
302b0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
302c0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
302d0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
302e0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
302f0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
30300 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
30310 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
30320 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
30330 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
30340 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
30350 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
30360 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
30370 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
30380 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
30390 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
303a0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
303b0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
303c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
303d0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
303e0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
303f0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
30400 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
30410 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
30420 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
30430 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
30440 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
30450 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
30460 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
30470 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
30480 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
30490 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
304a0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
304b0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
304c0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
304d0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
304e0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
304f0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
30500 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
30510 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
30520 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
30530 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
30540 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
30550 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
30560 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
30570 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
30580 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
30590 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
305a0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
305b0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
305c0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
305d0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
305e0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
305f0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
30600 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
30610 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
30620 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
30630 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67  QLITE_CORRUPT; g
30640 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
30650 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  nup; }.    }.  }
30660 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
30670 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
30680 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
30690 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
306a0 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
306b0 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
306c0 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
306d0 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
306e0 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
306f0 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
30700 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
30710 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
30720 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
30730 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
30740 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
30750 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
30760 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
30770 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
30780 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
30790 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
307a0 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
307b0 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
307c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
307d0 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
307e0 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
307f0 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
30800 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
30810 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
30820 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
30830 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
30840 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
30850 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
30860 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
30870 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
30880 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
30890 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
308a0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
308b0 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
308c0 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
308d0 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
308e0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
308f0 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
30900 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
30910 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
30920 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
30930 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
30940 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
30950 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
30960 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
30970 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
30980 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
30990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
309a0 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
309b0 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
309c0 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
309d0 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
309e0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
309f0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
30a00 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
30a10 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
30a20 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
30a30 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
30a40 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
30a50 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74  ht==0 || szRight
30a60 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
30a70 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
30a80 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69  2) ){.      szRi
30a90 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d  ght += szCell[d]
30aa0 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65   + 2;.      szLe
30ab0 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20  ft -= szCell[r] 
30ac0 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  + 2;.      cntNe
30ad0 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20  w[i-1]--;.      
30ae0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
30af0 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72  - 1;.      d = r
30b00 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b   + 1 - leafData;
30b10 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77  .    }.    szNew
30b20 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20  [i] = szRight;. 
30b30 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20     szNew[i-1] = 
30b40 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f  szLeft;.  }..  /
30b50 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e  * Either we foun
30b60 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65  d one or more ce
30b70 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e  lls (cntnew[0])>
30b80 30 29 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20  0) or pPage is. 
30b90 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f   ** a virtual ro
30ba0 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72 74  ot page.  A virt
30bb0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
30bc0 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72   when the real r
30bd0 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73  oot.  ** page is
30be0 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20 61   page 1 and we a
30bf0 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c  re the only chil
30c00 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a  d of that page..
30c10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63    */.  assert( c
30c20 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70  ntNew[0]>0 || (p
30c30 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20  Parent->pgno==1 
30c40 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
30c50 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43  l==0) );..  TRAC
30c60 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
30c70 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20  : %d %d %d  ",. 
30c80 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e     apOld[0]->pgn
30c90 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  o, .    nOld>=2 
30ca0 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f  ? apOld[1]->pgno
30cb0 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
30cc0 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67  3 ? apOld[2]->pg
30cd0 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20  no : 0.  ));..  
30ce0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
30cf0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
30d00 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
30d10 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
30d20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b   */.  if( apOld[
30d30 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20  0]->pgno<=1 ){. 
30d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30d50 4f 52 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f  ORRUPT;.    goto
30d60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
30d70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67  ;.  }.  pageFlag
30d80 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44  s = apOld[0]->aD
30d90 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
30da0 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
30db0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
30dc0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
30dd0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
30de0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
30df0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64  [i];.      apOld
30e00 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  [i] = 0;.      r
30e10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e20 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
30e30 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77  age);.      nNew
30e40 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ++;.      if( rc
30e50 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
30e60 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c  cleanup;.    }el
30e70 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
30e80 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72  ( i>0 );.      r
30e90 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
30ea0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
30eb0 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30  , &pgno, pgno, 0
30ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
30ed0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
30ee0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
30ef0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
30f00 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20       nNew++;..  
30f10 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
30f20 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
30f30 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
30f40 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
30f50 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
30f60 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
30f70 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
30f80 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
30f90 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
30fa0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
30fb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30fd0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
30fe0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
30ff0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31000 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
31010 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
31020 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
31030 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
31040 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
31050 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66   i<nOld ){.    f
31060 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
31070 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
31080 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
31090 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
310a0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
310b0 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
310c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
310d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
310e0 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
310f0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
31100 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
31110 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
31120 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
31130 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
31140 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
31150 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
31160 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
31170 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
31180 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
31190 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
311a0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
311b0 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
311c0 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
311d0 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
311e0 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
311f0 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
31200 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
31210 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
31220 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
31230 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
31240 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
31250 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
31260 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
31270 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
31280 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
31290 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
312a0 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
312b0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
312c0 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
312d0 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
312e0 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
312f0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
31300 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
31310 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70     int minV = ap
31320 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
31330 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
31340 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
31350 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
31360 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  if( apNew[j]->pg
31370 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  no<(unsigned)min
31380 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
31390 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
313a0 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e  inV = apNew[j]->
313b0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
313c0 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
313d0 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
313e0 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
313f0 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
31400 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
31410 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77        pT = apNew
31420 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  [i];.      apNew
31430 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49  [i] = apNew[minI
31440 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d  ];.      apNew[m
31450 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d  inI] = pT;.    }
31460 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e  .  }.  TRACE(("n
31470 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
31480 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
31490 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61  %d(%d)\n",.    a
314a0 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73  pNew[0]->pgno, s
314b0 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
314c0 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d  w>=2 ? apNew[1]-
314d0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
314e0 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
314f0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
31500 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20   apNew[2]->pgno 
31510 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
31520 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
31530 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77   nNew>=4 ? apNew
31540 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [3]->pgno : 0, n
31550 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33  New>=4 ? szNew[3
31560 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
31570 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70  =5 ? apNew[4]->p
31580 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  gno : 0, nNew>=5
31590 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
315a0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
315b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
315c0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
315d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74  DbPage) );.  put
315e0 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61 70  4byte(pRight, ap
315f0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
31600 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45  o);..  /*.  ** E
31610 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65  venly distribute
31620 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43   the data in apC
31630 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65  ell[] across the
31640 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a   new pages..  **
31650 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20   Insert divider 
31660 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65  cells into pPare
31670 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  nt as necessary.
31680 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20  .  */.  j = 0;. 
31690 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
316a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41  ; i++){.    /* A
316b0 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20  ssemble the new 
316c0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
316d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
316e0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  ew = apNew[i];. 
316f0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
31700 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65  xCells );.    ze
31710 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67  roPage(pNew, pag
31720 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73  eFlags);.    ass
31730 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
31740 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70  cntNew[i]-j, &ap
31750 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c  Cell[j], &szCell
31760 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [j]);.    assert
31770 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20  ( pNew->nCell>0 
31780 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63  || (nNew==1 && c
31790 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a  ntNew[0]==0) );.
317a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
317b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
317c0 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  ;..    j = cntNe
317d0 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
317e0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
317f0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
31800 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
31810 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
31820 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
31830 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
31840 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
31850 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
31860 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31  assert( i<nNew-1
31870 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a   || j==nCell );.
31880 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20      if( j<nCell 
31890 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
318a0 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  ll;.      u8 *pT
318b0 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  emp;.      int s
318c0 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  z;..      assert
318d0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
318e0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61  .      pCell = a
318f0 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  pCell[j];.      
31900 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b  sz = szCell[j] +
31910 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
31920 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
31930 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c  aOvflSpace[iOvfl
31940 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66  Space];.      if
31950 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b  ( !pNew->leaf ){
31960 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
31970 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c  &pNew->aData[8],
31980 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20   pCell, 4);.    
31990 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66    }else if( leaf
319a0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
319b0 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
319c0 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
319d0 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
319e0 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
319f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
31a00 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
31a10 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
31a20 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
31a30 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
31a40 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
31a50 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
31a60 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
31a70 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
31a80 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
31a90 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
31aa0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
31ab0 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
31ac0 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
31ad0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
31ae0 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62    j--;.        b
31af0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
31b00 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
31b10 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
31b20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
31b30 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
31b40 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
31b50 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
31b60 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
31b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
31b80 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
31b90 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
31ba0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
31bb0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
31bc0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
31bd0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
31be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
31bf0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
31c00 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
31c10 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
31c20 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
31c30 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
31c40 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
31c50 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
31c60 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
31c70 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72 73  * (see btreePars
31c80 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
31c90 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
31ca0 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
31cb0 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
31cc0 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
31cd0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
31ce0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
31cf0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
31d00 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
31d10 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
31d20 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
31d30 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
31d40 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
31d50 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
31d60 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
31d70 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
31d80 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
31d90 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
31da0 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
31db0 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
31dc0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
31dd0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
31de0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
31df0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
31e00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31e10 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
31e20 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
31e30 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
31e40 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
31e50 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
31e60 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
31e70 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
31e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
31e90 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a  vflSpace += sz;.
31ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
31eb0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
31ec0 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  4 );.      asser
31ed0 74 28 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70  t( iOvflSpace<=p
31ee0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
31ef0 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c        insertCell
31f00 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
31f10 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
31f20 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26  p, pNew->pgno, &
31f30 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
31f40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
31f50 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
31f60 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nup;.      asser
31f70 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
31f80 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
31f90 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
31fa0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
31fb0 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
31fc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
31fd0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
31fe0 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
31ff0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
32000 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
32010 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
32020 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
32030 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
32040 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
32050 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
32060 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
32070 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
32080 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  );.  }..  if( is
32090 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d  Root && pParent-
320a0 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61  >nCell==0 && pPa
320b0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c  rent->hdrOffset<
320c0 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65  =apNew[0]->nFree
320d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
320e0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
320f0 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61  b-tree now conta
32100 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68  ins no cells. Th
32110 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20  e only sibling. 
32120 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68     ** page is th
32130 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
32140 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70   the parent. Cop
32150 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
32160 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69  f the.    ** chi
32170 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ld page into the
32180 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73   parent, decreas
32190 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ing the overall 
321a0 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20  height of the.  
321b0 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75    ** b-tree stru
321c0 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68  cture by one. Th
321d0 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64 20  is is described 
321e0 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d  as the "balance-
321f0 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a  shallower".    *
32200 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20  * sub-algorithm 
32210 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74  in some document
32220 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20  ation..    **.  
32230 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
32240 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
32250 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c  atabase, the cal
32260 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  l to copyNodeCon
32270 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73  tent() .    ** s
32280 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ets all pointer-
32290 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
322a0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74  esponding to dat
322b0 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67 65  abase image page
322c0 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68  s .    ** for wh
322d0 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ich the pointer 
322e0 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  is stored within
322f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   the content bei
32300 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a  ng copied..    *
32310 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63  *.    ** The sec
32320 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77  ond assert below
32330 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
32340 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  he child page is
32350 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20   defragmented.  
32360 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65    ** (it must be
32370 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73 74  , as it was just
32380 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75   reconstructed u
32390 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67  sing assemblePag
323a0 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a  e()). This.    *
323b0 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  * is important i
323c0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
323d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
323e0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
323f0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d  tabase.    ** im
32400 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  age.  */.    ass
32410 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a  ert( nNew==1 );.
32420 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e 65      assert( apNe
32430 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a  w[0]->nFree == .
32440 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79 74          (get2byt
32450 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61  e(&apNew[0]->aDa
32460 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d  ta[5])-apNew[0]-
32470 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65  >cellOffset-apNe
32480 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a  w[0]->nCell*2) .
32490 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e      );.    copyN
324a0 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77  odeContent(apNew
324b0 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72  [0], pParent, &r
324c0 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65  c);.    freePage
324d0 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b  (apNew[0], &rc);
324e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41  .  }else if( ISA
324f0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
32500 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e   /* Fix the poin
32510 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
32520 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c  for all the cell
32530 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66  s that were shif
32540 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20  ted around. .   
32550 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65   ** There are se
32560 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20  veral different 
32570 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72  types of pointer
32580 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61  -map entries tha
32590 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  t need to.    **
325a0 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
325b0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
325c0 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61  Some of these ha
325d0 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65  ve been set alre
325e0 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20  ady, but.    ** 
325f0 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54  many have not. T
32600 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
32610 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a  a summary:.    *
32620 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68  *.    **   1) Th
32630 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  e entries associ
32640 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69  ated with new si
32650 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74  bling pages that
32660 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a   were not.    **
32670 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77        siblings w
32680 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
32690 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68  n was called. Th
326a0 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79  ese have already
326b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65  .    **      bee
326c0 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20  n set. We don't 
326d0 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62  need to worry ab
326e0 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73  out old siblings
326f0 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a   that were.    *
32700 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20  *      moved to 
32710 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20  the free-list - 
32720 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63  the freePage() c
32730 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61  ode has taken ca
32740 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  re.    **      o
32750 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a  f those..    **.
32760 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20      **   2) The 
32770 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
32780 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
32790 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76  ith the first ov
327a0 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20  erflow.    **   
327b0 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f     page in any o
327c0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75  verflow chains u
327d0 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64  sed by new divid
327e0 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20  er cells. These 
327f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76  .    **      hav
32800 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62  e also already b
32810 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f  een taken care o
32820 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43  f by the insertC
32830 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20  ell() code..    
32840 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49  **.    **   3) I
32850 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
32860 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
32870 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
32880 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20  ld pages of.    
32890 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74  **      cells st
328a0 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c  ored on the sibl
328b0 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65  ing pages may ne
328c0 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
328d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
328e0 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c    4) If the sibl
328f0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
32900 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65  t internal intke
32910 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e  y nodes, then an
32920 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76  y.    **      ov
32930 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65  erflow pages use
32940 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73  d by these cells
32950 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
32960 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20  updated.    **  
32970 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e      (internal in
32980 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72  tkey nodes never
32990 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
329a0 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  s to overflow pa
329b0 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ges)..    **.   
329c0 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20   **   5) If the 
329d0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
329e0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
329f0 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  en the pointer-m
32a00 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65  ap.    **      e
32a10 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72  ntries for the r
32a20 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73  ight-child pages
32a30 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67   of each sibling
32a40 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
32a50 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61        to be upda
32a60 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
32a70 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32  ** Cases 1 and 2
32a80 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20   are dealt with 
32a90 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63  above by other c
32aa0 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20  ode. The next.  
32ab0 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73    ** block deals
32ac0 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e   with cases 3 an
32ad0 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20  d 4 and the one 
32ae0 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65  after that, case
32af0 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a   5. Since.    **
32b00 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74   setting a point
32b10 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20  er map entry is 
32b20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70  a relatively exp
32b30 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
32b40 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f  , this.    ** co
32b50 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69  de only sets poi
32b60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
32b70 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76   for child or ov
32b80 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61  erflow pages tha
32b90 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63  t have.    ** ac
32ba0 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74  tually moved bet
32bb0 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a  ween pages.  */.
32bc0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
32bd0 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20  w = apNew[0];.  
32be0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20    MemPage *pOld 
32bf0 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20  = apCopy[0];.   
32c00 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d   int nOverflow =
32c10 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
32c20 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f  ;.    int iNextO
32c30 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ld = pOld->nCell
32c40 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20   + nOverflow;.  
32c50 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20    int iOverflow 
32c60 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70  = (nOverflow ? p
32c70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
32c80 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  x : -1);.    j =
32c90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cb0 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
32cc0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
32cd0 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cf0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
32d00 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
32d10 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
32d20 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
32d30 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
32d40 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
32d50 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
32d60 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
32d70 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
32d80 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
32d90 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
32da0 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
32db0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
32dc0 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
32dd0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
32de0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
32df0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
32e00 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
32e10 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
32e20 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
32e30 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64   */.        pOld
32e40 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a   = apCopy[++j];.
32e50 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64          iNextOld
32e60 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
32e70 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   + pOld->nCell +
32e80 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
32e90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
32ea0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
32eb0 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72  .          nOver
32ec0 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
32ed0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
32ee0 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20    iOverflow = i 
32ef0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
32f00 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
32f10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32f20 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
32f30 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20  !leafData;  .   
32f40 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
32f50 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  rt(nOverflow>0 |
32f60 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b  | iOverflow<i );
32f70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
32f80 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c  verflow<2 || pOl
32f90 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  d->aOvfl[0].idx=
32fa0 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e  =pOld->aOvfl[1].
32fb0 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  idx-1);.      as
32fc0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
32fd0 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
32fe0 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  1].idx==pOld->aO
32ff0 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[2].idx-1);. 
33000 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65       if( i==iOve
33010 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
33020 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a   isDivider = 1;.
33030 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e          if( (--n
33040 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20  Overflow)>0 ){. 
33050 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
33060 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow++;.        }.
33070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
33080 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20  f( i==cntNew[k] 
33090 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
330a0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
330b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
330c0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
330d0 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20  cell on new.    
330e0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
330f0 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69  age k. If the si
33100 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
33110 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
33120 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
33130 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
33140 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64  ell i is a divid
33150 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  er cell.  */.   
33160 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
33170 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  w[++k];.        
33180 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20  if( !leafData ) 
33190 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
331a0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
331b0 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20  j<nOld );.      
331c0 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29  assert( k<nNew )
331d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
331e0 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67  he cell was orig
331f0 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63  inally divider c
33200 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20  ell (and is not 
33210 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a  now) or.      **
33220 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   an overflow cel
33230 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c  l, or if the cel
33240 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e  l was located on
33250 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62   a different sib
33260 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61  ling.      ** pa
33270 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  ge before the ba
33280 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68  lancing, then th
33290 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
332a0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
332b0 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61  .      ** with a
332c0 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  ny child or over
332d0 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20  flow pages need 
332e0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20  to be updated.  
332f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
33300 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e  ivider || pOld->
33310 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
33320 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
33330 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
33340 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
33350 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
33360 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c  byte(apCell[i]),
33370 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
33380 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
33390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
333a0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d     if( szCell[i]
333b0 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
333c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 74 72  ){.          ptr
333d0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
333e0 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26  ew, apCell[i], &
333f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
33400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
33410 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
33420 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66  ction ){.      f
33430 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
33440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33  i++){.        u3
33450 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65  2 key = get4byte
33460 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74  (&apNew[i]->aDat
33470 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  a[8]);.        p
33480 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65  trmapPut(pBt, ke
33490 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  y, PTRMAP_BTREE,
334a0 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c   apNew[i]->pgno,
334b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
334c0 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
334d0 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65  /* The ptrmapChe
334e0 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69  ckPages() contai
334f0 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ns assert() stat
33500 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69  ements that veri
33510 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  fy that.    ** a
33520 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ll pointer map p
33530 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72  ages are set cor
33540 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20  rectly. This is 
33550 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20  helpful while . 
33560 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e     ** debugging.
33570 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
33580 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73   disabled becaus
33590 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
335a0 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  base may.    ** 
335b0 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28  cause an assert(
335c0 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66  ) statement to f
335d0 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72  ail.  */.    ptr
335e0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70  mapCheckPages(ap
335f0 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
33600 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
33610 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23  (&pParent, 1);.#
33620 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73  endif.  }..  ass
33630 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
33640 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28  Init );.  TRACE(
33650 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
33660 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d  hed: old=%d new=
33670 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
33680 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20            nOld, 
33690 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a  nNew, nCell));..
336a0 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
336b0 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
336c0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
336d0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
336e0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
336f0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
33700 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
33710 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
33720 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
33730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
33740 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
33750 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
33760 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ]);.  }..  retur
33770 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
33780 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
33790 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
337a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
337b0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
337c0 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20   is.** overfull 
337d0 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  (has one or more
337e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
337f0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68  ..**.** A new ch
33800 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  ild page is allo
33810 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f  cated and the co
33820 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75  ntents of the cu
33830 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61  rrent root.** pa
33840 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76  ge, including ov
33850 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72  erflow cells, ar
33860 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  e copied into th
33870 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f  e child. The roo
33880 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65  t.** page is the
33890 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f  n overwritten to
338a0 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74   make it an empt
338b0 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  y page with the 
338c0 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20  right-child .** 
338d0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
338e0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
338f0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
33900 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f  eturning, all po
33910 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
33920 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
33930 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61  to pages .** tha
33940 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d  t the new child-
33950 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  page now contain
33960 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72  s pointers to ar
33970 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a  e updated. The.*
33980 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f  * entry correspo
33990 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nding to the new
339a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
339b0 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  nter of the root
339c0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f  .** page is also
339d0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
339e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
339f0 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
33a00 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65  o contain a refe
33a10 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69  rence to the chi
33a20 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20  ld .** page and 
33a30 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
33a40 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
33a50 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ase the caller i
33a60 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
33a70 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
33a80 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20  e() on *ppChild 
33a90 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66  exactly once. If
33aa0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
33ab0 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
33ac0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
33ad0 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  nd *ppChild is s
33ae0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
33af0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
33b00 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
33b10 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  Root, MemPage **
33b20 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20  ppChild){.  int 
33b30 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
33b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
33b50 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
33b60 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
33b70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
33b80 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
33b90 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
33ba0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
33bb0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
33bc0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
33bd0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33be0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
33bf0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
33c00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
33c10 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Root->pBt;    /*
33c20 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20   The BTree */.. 
33c30 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
33c40 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
33c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33c60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
33c70 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
33c80 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65   Make pRoot, the
33c90 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
33ca0 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62  e b-tree, writab
33cb0 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  le. Allocate a n
33cc0 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68  ew .  ** page th
33cd0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
33ce0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
33cf0 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70  ld of pPage. Cop
33d00 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  y the contents. 
33d10 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20   ** of the node 
33d20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20  stored on pRoot 
33d30 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69  into the new chi
33d40 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ld page..  */.  
33d50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33d60 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
33d70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
33d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33d90 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
33da0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70  BtreePage(pBt,&p
33db0 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64  Child,&pgnoChild
33dc0 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b  ,pRoot->pgno,0);
33dd0 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  .    copyNodeCon
33de0 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69  tent(pRoot, pChi
33df0 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  ld, &rc);.    if
33e00 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
33e10 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
33e20 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  t(pBt, pgnoChild
33e30 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33e40 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  pRoot->pgno, &rc
33e50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
33e60 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70  f( rc ){.    *pp
33e70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
33e80 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
33e90 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
33ea0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
33eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
33ec0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
33ed0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
33ee0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
33ef0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33f00 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
33f10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
33f20 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
33f30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
33f40 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
33f50 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
33f60 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
33f70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
33f80 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
33f90 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33fa0 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
33fb0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
33fc0 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
33fd0 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c  l, pRoot->aOvfl,
33fe0 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f   pRoot->nOverflo
33ff0 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e  w*sizeof(pRoot->
34000 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
34010 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
34020 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  = pRoot->nOverfl
34030 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74  ow;..  /* Zero t
34040 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
34050 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61  Root. Then insta
34060 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74 68 65  ll pChild as the
34070 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f   right-child. */
34080 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f  .  zeroPage(pRoo
34090 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  t, pChild->aData
340a0 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29  [0] & ~PTF_LEAF)
340b0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 52  ;.  put4byte(&pR
340c0 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
340d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
340e0 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a  pgnoChild);..  *
340f0 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64  ppChild = pChild
34100 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
34110 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
34120 68 65 20 70 61 67 65 20 74 68 61 74 20 70 43 75  he page that pCu
34130 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
34140 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62  ts to has just b
34150 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a  een modified in.
34160 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69  ** some way. Thi
34170 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72  s function figur
34180 65 73 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d  es out if this m
34190 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e  odification mean
341a0 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65  s the.** tree ne
341b0 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
341c0 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61  ed, and if so ca
341d0 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70 72 69  lls the appropri
341e0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a  ate balancing .*
341f0 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e  * routine. Balan
34200 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  cing routines ar
34210 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e  e:.**.**   balan
34220 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20  ce_quick().**   
34230 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
34240 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f  .**   balance_no
34250 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69  nroot().*/.stati
34260 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74  c int balance(Bt
34270 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
34280 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
34290 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  _OK;.  const int
342a0 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42   nMin = pCur->pB
342b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20  t->usableSize * 
342c0 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c  2 / 3;.  u8 aBal
342d0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31  anceQuickSpace[1
342e0 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  3];.  u8 *pFree 
342f0 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59  = 0;..  TESTONLY
34300 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  ( int balance_qu
34310 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  ick_called = 0 )
34320 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
34330 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
34340 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a  _called = 0 );..
34350 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69    do {.    int i
34360 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
34370 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  ge;.    MemPage 
34380 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
34390 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20  pPage[iPage];.. 
343a0 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20     if( iPage==0 
343b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
343c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ge->nOverflow ){
343d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
343e0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
343f0 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66   b-tree is overf
34400 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
34410 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20  e call the.     
34420 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65     ** balance_de
34430 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  eper() function 
34440 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
34450 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f  child for the ro
34460 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
34470 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20  ** and copy the 
34480 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
34490 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
344a0 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20  e to it. The.   
344b0 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65       ** next ite
344c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
344d0 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
344e0 63 65 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  ce the child pag
344f0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20  e..        */ . 
34500 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
34510 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
34520 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
34530 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
34540 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65  nce_deeper(pPage
34550 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
34560 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
34570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34580 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  {.          pCur
34590 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  ->iPage = 1;.   
345a0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
345b0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[0] = 0;.     
345c0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
345d0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
345e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
345f0 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65  >apPage[1]->nOve
34600 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20  rflow );.       
34610 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
34620 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
34630 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
34640 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
34650 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67  rflow==0 && pPag
34660 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29  e->nFree<=nMin )
34670 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
34680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34690 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20  MemPage * const 
346a0 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e  pParent = pCur->
346b0 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b  apPage[iPage-1];
346c0 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  .      int const
346d0 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69   iIdx = pCur->ai
346e0 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20  Idx[iPage-1];.. 
346f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34700 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
34710 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ent->pDbPage);. 
34720 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34730 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65  ITE_OK ){.#ifnde
34740 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
34750 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20  ICKBALANCE.     
34760 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
34770 73 44 61 74 61 0a 20 20 20 20 20 20 20 20 20 26  sData.         &
34780 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  & pPage->nOverfl
34790 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26  ow==1.         &
347a0 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  & pPage->aOvfl[0
347b0 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
347c0 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  ell.         && 
347d0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31  pParent->pgno!=1
347e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
347f0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64  rent->nCell==iId
34800 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  x.        ){.   
34810 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62         /* Call b
34820 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74  alance_quick() t
34830 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 73  o create a new s
34840 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20  ibling of pPage 
34850 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  on which.       
34860 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74     ** to store t
34870 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
34880 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  . balance_quick(
34890 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20  ) inserts a new 
348a0 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a  cell.          *
348b0 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20  * into pParent, 
348c0 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
348d0 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  pParent overflow
348e0 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 20 20  . If this.      
348f0 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
34900 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74  the next interat
34910 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
34920 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
34930 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20  pParent .       
34940 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72     ** use either
34950 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34960 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65  () or balance_de
34970 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68  eper(). Until th
34980 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
34990 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65  happens, the ove
349a0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74  rflow cell is st
349b0 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c  ored in the aBal
349c0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
349d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
349e0 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20  ffer. .         
349f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
34a00 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20   The purpose of 
34a10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
34a20 73 65 72 74 28 29 20 69 73 20 74 6f 20 63 68 65  sert() is to che
34a30 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20  ck that only a. 
34a40 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
34a50 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  le call to balan
34a60 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61  ce_quick() is ma
34a70 64 65 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  de for each call
34a80 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20   to this.       
34a90 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20     ** function. 
34aa0 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
34ab0 20 76 65 72 69 66 69 65 64 2c 20 61 20 73 75 62   verified, a sub
34ac0 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e  tle bug involvin
34ad0 67 20 72 65 75 73 65 0a 20 20 20 20 20 20 20 20  g reuse.        
34ae0 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c    ** of the aBal
34af0 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d  anceQuickSpace[]
34b00 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e   might sneak in.
34b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
34b20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34b30 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63  (balance_quick_c
34b40 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20  alled++)==0 );. 
34b50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61           rc = ba
34b60 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72  lance_quick(pPar
34b70 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c  ent, pPage, aBal
34b80 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b  anceQuickSpace);
34b90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
34ba0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
34bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
34bc0 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20  this case, call 
34bd0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
34be0 29 20 74 6f 20 72 65 64 69 73 74 72 69 62 75 74  ) to redistribut
34bf0 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  e cells.        
34c00 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61    ** between pPa
34c10 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f  ge and up to 2 o
34c20 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61  f its sibling pa
34c30 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76  ges. This involv
34c40 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
34c50 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
34c60 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e  ntents of pParen
34c70 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
34c80 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20  se pParent to.  
34c90 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d          ** becom
34ca0 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e  e overfull or un
34cb0 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78  derfull. The nex
34cc0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
34cd0 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20  he do-loop.     
34ce0 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c       ** will bal
34cf0 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
34d00 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20  page to correct 
34d10 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20  this..          
34d20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ** .          **
34d30 20 49 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   If the parent p
34d40 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
34d50 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c  full, the overfl
34d60 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73  ow cell or cells
34d70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
34d80 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
34d90 70 53 70 61 63 65 20 62 75 66 66 65 72 20 61 6c  pSpace buffer al
34da0 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74  located immediat
34db0 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20  ely below. .    
34dc0 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65        ** A subse
34dd0 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  quent iteration 
34de0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
34df0 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68  ill deal with th
34e00 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  is by.          
34e10 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e  ** calling balan
34e20 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61  ce_nonroot() (ba
34e30 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d  lance_deeper() m
34e40 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ay be called fir
34e50 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  st,.          **
34e60 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20   but it doesn't 
34e70 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c  deal with overfl
34e80 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20  ow cells - just 
34e90 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a  moves them to a.
34ea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66            ** dif
34eb0 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e  ferent page). On
34ec0 63 65 20 74 68 69 73 20 73 75 62 73 65 71 75 65  ce this subseque
34ed0 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  nt call to balan
34ee0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20  ce_nonroot() .  
34ef0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63          ** has c
34f00 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20  ompleted, it is 
34f10 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20  safe to release 
34f20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
34f30 72 20 75 73 65 64 20 62 79 0a 20 20 20 20 20 20  r used by.      
34f40 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69      ** the previ
34f50 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65  ous call, as the
34f60 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64   overflow cell d
34f70 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65  ata will have be
34f80 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  en .          **
34f90 20 63 6f 70 69 65 64 20 65 69 74 68 65 72 20 69   copied either i
34fa0 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
34fb0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
34fc0 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  or into the new.
34fd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70            ** pSp
34fe0 61 63 65 20 62 75 66 66 65 72 20 70 61 73 73 65  ace buffer passe
34ff0 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20  d to the latter 
35000 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
35010 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20  nonroot()..     
35020 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
35030 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73    u8 *pSpace = s
35040 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
35050 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65  (pCur->pBt->page
35060 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
35070 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
35080 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69  nroot(pParent, i
35090 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61  Idx, pSpace, iPa
350a0 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20  ge==1);.        
350b0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
350c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
350d0 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55   pFree is not NU
350e0 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  LL, it points to
350f0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
35100 65 72 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  er used .       
35110 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65       ** by a pre
35120 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61  vious call to ba
35130 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
35140 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72   Its contents ar
35150 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
35160 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68   now stored eith
35170 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62  er on real datab
35180 61 73 65 20 70 61 67 65 73 20 6f 72 20 77 69 74  ase pages or wit
35190 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20  hin the .       
351a0 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61       ** new pSpa
351b0 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74  ce buffer, so it
351c0 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79 20 66   may be safely f
351d0 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20  reed here. */.  
351e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
351f0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
35200 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
35210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
35220 70 53 70 61 63 65 20 62 75 66 66 65 72 20 77 69  pSpace buffer wi
35230 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66 74 65  ll be freed afte
35240 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  r the next call 
35250 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
35260 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
35270 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72  ), or just befor
35280 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
35290 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76  returns, whichev
352a0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
352b0 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a  comes first. */.
352c0 20 20 20 20 20 20 20 20 20 20 70 46 72 65 65 20            pFree 
352d0 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20  = pSpace;.      
352e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
352f0 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
35300 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  low = 0;..      
35310 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74 65 72  /* The next iter
35320 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
35330 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68  loop balances th
35340 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a  e parent page. *
35350 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
35360 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
35370 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
35380 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
35390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
353a0 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  ;..  if( pFree )
353b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
353c0 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
353d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
353e0 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  .../*.** Insert 
353f0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
35400 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68  o the BTree.  Th
35410 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62  e key is given b
35420 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a  y (pKey,nKey).**
35430 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73   and the data is
35440 20 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61   given by (pData
35450 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75  ,nData).  The cu
35460 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c  rsor is used onl
35470 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77  y to.** define w
35480 68 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65  hat table the re
35490 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69  cord should be i
354a0 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54  nserted into.  T
354b0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
354c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
354d0 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69   a random locati
354e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  on..**.** For an
354f0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f   INTKEY table, o
35500 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c  nly the nKey val
35510 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  ue of the key is
35520 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a   used.  pKey is.
35530 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72  ** ignored.  For
35540 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c   a ZERODATA tabl
35550 65 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64  e, the pData and
35560 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20   nData are both 
35570 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
35580 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
35590 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
355a0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
355b0 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74  uccessful call t
355c0 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63  o.** MovetoUnpac
355d0 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75  ked() to seek cu
355e0 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b  rsor pCur to (pK
355f0 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c  ey, nKey) has al
35600 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65  ready.** been pe
35610 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73  rformed. seekRes
35620 75 6c 74 20 69 73 20 74 68 65 20 73 65 61 72 63  ult is the searc
35630 68 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  h result returne
35640 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a  d (a negative.**
35650 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75 72 20   number if pCur 
35660 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74  points at an ent
35670 72 79 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ry that is small
35680 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e  er than (pKey, n
35690 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f  Key), or.** a po
356a0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
356b0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
356c0 6e 20 65 74 72 79 20 74 68 61 74 20 69 73 20 6c  n etry that is l
356d0 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28  arger than .** (
356e0 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a  pKey, nKey)). .*
356f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b  *.** If the seek
35700 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72  Result parameter
35710 20 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73   is 0, then curs
35720 6f 72 20 70 43 75 72 20 6d 61 79 20 70 6f 69 6e  or pCur may poin
35730 74 20 74 6f 20 61 6e 79 20 0a 2a 2a 20 65 6e 74  t to any .** ent
35740 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72  ry or to no entr
35750 79 20 61 74 20 61 6c 6c 2e 20 49 6e 20 74 68 69  y at all. In thi
35760 73 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63  s case this func
35770 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
35780 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
35790 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
357a0 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
357b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
357c0 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
357d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
357f0 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
35800 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
35810 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
35820 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
35830 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
35840 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
35850 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
35860 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
35870 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
35880 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
35890 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
358a0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
358b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
358d0 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
358e0 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
358f0 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
35900 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
35910 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
35920 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
35930 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
35940 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
35950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
35960 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d  esult of prior M
35970 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
35980 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  call */.){.  int
35990 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d   rc;.  int loc =
359a0 20 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69   seekResult;.  i
359b0 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20  nt szNew;.  int 
359c0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
359d0 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
359e0 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
359f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
35a00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
35a10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
35a20 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
35a30 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
35a40 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   0;..  if( pCur-
35a50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
35a60 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73  FAULT ){.    ass
35a70 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
35a80 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
35a90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  ;.    return pCu
35aa0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
35ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
35ac0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
35ad0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
35ae0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
35af0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
35b00 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
35b10 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  && !pBt->readOnl
35b20 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  y );.  assert( h
35b30 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
35b40 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e  leLock(p, pCur->
35b50 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e  pgnoRoot, pCur->
35b60 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20  pKeyInfo!=0, 2) 
35b70 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
35b80 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
35b90 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73 74  has been consist
35ba0 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75 72  ent. If this cur
35bb0 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a 20  sor was opened. 
35bc0 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61 6e   ** expecting an
35bd0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 74   index b-tree, t
35be0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73  hen the caller s
35bf0 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
35c00 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65 79  ng blob.  ** key
35c10 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63 69  s with no associ
35c20 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74 68  ated data. If th
35c30 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  e cursor was ope
35c40 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61 6e  ned expecting an
35c50 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61 62  .  ** intkey tab
35c60 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73  le, the caller s
35c70 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 69  hould be inserti
35c80 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  ng integer keys 
35c90 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f 62  with a.  ** blob
35ca0 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20 64   of associated d
35cb0 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ata.  */.  asser
35cc0 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28 70  t( (pKey==0)==(p
35cd0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
35ce0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
35cf0 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20  is is an insert 
35d00 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74  into a table b-t
35d10 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  ree, invalidate 
35d20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20  any incrblob .  
35d30 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
35d40 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67  on the row being
35d50 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d   replaced (assum
35d60 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65  ing this is a re
35d70 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61  place.  ** opera
35d80 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20  tion - if it is 
35d90 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  not, the followi
35da0 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20  ng is a no-op). 
35db0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
35dc0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
35dd0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63     invalidateInc
35de0 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20  rblobCursors(p, 
35df0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
35e00 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
35e10 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
35e20 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
35e30 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
35e40 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a   on this table..
35e50 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d    **.  ** In som
35e60 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c  e cases, the cal
35e70 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74 6f  l to btreeMoveto
35e80 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e 6f  () below is a no
35e90 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65 78  -op. For.  ** ex
35ea0 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73 65  ample, when inse
35eb0 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f 20  rting data into 
35ec0 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75 74  a table with aut
35ed0 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74 65  o-generated inte
35ee0 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20 74  ger.  ** keys, t
35ef0 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69 6e  he VDBE layer in
35f00 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74 72  vokes sqlite3Btr
35f10 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67 75  eeLast() to figu
35f20 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a 2a  re out the .  **
35f30 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f 20   integer key to 
35f40 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61 6c  use. It then cal
35f50 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
35f60 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e 73   to actually ins
35f70 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  ert the .  ** da
35f80 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 6b  ta into the intk
35f90 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74 68  ey B-Tree. In th
35fa0 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f 76  is case btreeMov
35fb0 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73  eto() recognizes
35fc0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63  .  ** that the c
35fd0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
35fe0 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20   where it needs 
35ff0 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e  to be and return
36000 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64  s without.  ** d
36010 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54  oing any work. T
36020 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e  o avoid thwartin
36030 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  g these optimiza
36040 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70  tions, it is imp
36050 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20  ortant.  ** not 
36060 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72  to clear the cur
36070 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20  sor here..  */. 
36080 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
36090 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
360a0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
360b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
360c0 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c 6f  rn rc;.  if( !lo
360d0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  c ){.    rc = bt
360e0 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
360f0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65  pKey, nKey, appe
36100 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a 20  ndBias, &loc);. 
36110 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
36120 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
36130 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
36140 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
36150 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65  || (pCur->eState
36160 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
36170 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70   && loc) );..  p
36180 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
36190 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
361a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
361b0 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
361c0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
361d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
361e0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
361f0 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49 4e  );..  TRACE(("IN
36200 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
36210 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
36220 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
36230 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
36240 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
36250 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
36260 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
36270 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
36280 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
36290 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
362a0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
362b0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
362c0 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43  ace(pBt);.  newC
362d0 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  ell = pBt->pTmpS
362e0 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43  pace;.  if( newC
362f0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
36300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36310 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
36320 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20  pPage, newCell, 
36330 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74  pKey, nKey, pDat
36340 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c  a, nData, nZero,
36350 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20   &szNew);.  if( 
36360 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  rc ) goto end_in
36370 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  sert;.  assert( 
36380 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50  szNew==cellSizeP
36390 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  tr(pPage, newCel
363a0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
363b0 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53  szNew<=MX_CELL_S
363c0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64  IZE(pBt) );.  id
363d0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
363e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
363f0 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20  if( loc==0 ){.  
36400 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20    u16 szOld;.   
36410 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
36420 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
36430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36440 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
36450 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
36460 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
36470 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
36480 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
36490 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
364a0 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  , idx);.    if( 
364b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
364c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
364d0 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
364e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
364f0 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
36500 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
36510 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
36520 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
36530 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  ell);.    dropCe
36540 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
36550 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  zOld, &rc);.    
36560 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
36570 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73  d_insert;.  }els
36580 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70  e if( loc<0 && p
36590 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Page->nCell>0 ){
365a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
365b0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20  ge->leaf );.    
365c0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
365d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
365e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
365f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
36600 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73 65  af );.  }.  inse
36610 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  rtCell(pPage, id
36620 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
36630 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a 20  w, 0, 0, &rc);. 
36640 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
36650 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d  ITE_OK || pPage-
36660 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67  >nCell>0 || pPag
36670 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
36680 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72  ;..  /* If no er
36690 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
366a0 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e  and pPage has an
366b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
366c0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a  call balance() .
366d0 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69    ** to redistri
366e0 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77  bute the cells w
366f0 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20  ithin the tree. 
36700 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20  Since balance() 
36710 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68  may move.  ** th
36720 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74  e cursor, zero t
36730 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  he BtCursor.info
36740 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72  .nSize and BtCur
36750 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20  sor.validNKey.  
36760 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20  ** variables..  
36770 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73  **.  ** Previous
36780 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
36790 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54  ite called moveT
367a0 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20  oRoot() to move 
367b0 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  the cursor.  ** 
367c0 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74  back to the root
367d0 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65   page as balance
367e0 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c  () used to inval
367f0 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  idate the conten
36800 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72  ts.  ** of BtCur
36810 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64  sor.apPage[] and
36820 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b   BtCursor.aiIdx[
36830 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f  ]. Instead of do
36840 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73  ing that,.  ** s
36850 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
36860 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22  ate to "invalid"
36870 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d  . This makes com
36880 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61  mon insert opera
36890 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68  tions.  ** sligh
368a0 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a  tly faster..  **
368b0 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61  .  ** There is a
368c0 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f   subtle but impo
368d0 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  rtant optimizati
368e0 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65  on here too. Whe
368f0 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a  n inserting.  **
36900 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64   multiple record
36910 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79  s into an intkey
36920 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20   b-tree using a 
36930 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61  single cursor (a
36940 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65  s can.  ** happe
36950 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  n while processi
36960 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e  ng an "INSERT IN
36970 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73  TO ... SELECT" s
36980 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20  tatement), it.  
36990 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f  ** is advantageo
369a0 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  us to leave the 
369b0 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  cursor pointing 
369c0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
369d0 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d  y in.  ** the b-
369e0 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65  tree if possible
369f0 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
36a00 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
36a10 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a   to the last.  *
36a20 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
36a30 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65  able, and the ne
36a40 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20  xt row inserted 
36a50 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b  has an integer k
36a60 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74  ey.  ** larger t
36a70 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
36a80 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74  existing key, it
36a90 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
36aa0 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20  insert the.  ** 
36ab0 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b  row without seek
36ac0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ing the cursor. 
36ad0 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69  This can be a bi
36ae0 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f  g performance bo
36af0 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  ost..  */.  pCur
36b00 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
36b10 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
36b20 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Key = 0;.  if( r
36b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36b40 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36b50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
36b60 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20  ance(pCur);..   
36b70 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75   /* Must make su
36b80 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  re nOverflow is 
36b90 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76  reset to zero ev
36ba0 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63  en if the balanc
36bb0 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73  e().    ** fails
36bc0 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20  . Internal data 
36bd0 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
36be0 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
36bf0 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20   otherwise. .   
36c00 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68   ** Also, set th
36c10 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
36c20 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20  o invalid. This 
36c30 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72  stops saveCursor
36c40 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a  Position().    *
36c50 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
36c60 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
36c70 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
36c80 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20  e cursor.  */.  
36c90 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
36ca0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
36cb0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
36cc0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
36cd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
36ce0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
36cf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
36d00 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
36d10 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73  w==0 );..end_ins
36d20 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ert:.  return rc
36d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
36d40 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  e the entry that
36d50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
36d60 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
36d70 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
36d80 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
36d90 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74   arbitrary locat
36da0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
36db0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
36dc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
36dd0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
36de0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
36df0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
36e00 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
36e10 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20    .  int rc;    
36e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
36e40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65  urn code */.  Me
36e50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
36e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e70 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65     /* Page to de
36e80 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a  lete cell from *
36e90 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
36ea0 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  r *pCell;       
36eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
36ec0 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64  ter to cell to d
36ed0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
36ee0 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20  CellIdx;        
36ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f00 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c  /* Index of cell
36f10 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
36f20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20  int iCellDepth; 
36f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f40 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66       /* Depth of
36f50 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67   node containing
36f60 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73   pCell */ ..  as
36f70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
36f80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
36f90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
36fa0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
36fb0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
36fc0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
36fd0 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72  dOnly );.  asser
36fe0 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  t( pCur->wrFlag 
36ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  );.  assert( has
37000 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
37010 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67  Lock(p, pCur->pg
37020 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b  noRoot, pCur->pK
37030 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b  eyInfo!=0, 2) );
37040 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52  .  assert( !hasR
37050 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
37060 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20  pCur->pgnoRoot) 
37070 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
37080 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
37090 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e  ->iPage]>=pCur->
370a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
370b0 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20  ge]->nCell) .   
370c0 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  || NEVER(pCur->e
370d0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
370e0 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  LID).  ){.    re
370f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
37100 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  R;  /* Something
37110 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20   has gone awry. 
37120 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  */.  }..  /* If 
37130 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65  this is a delete
37140 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65   operation to re
37150 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20  move a row from 
37160 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a  a table b-tree,.
37170 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20    ** invalidate 
37180 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
37190 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
371a0 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74   row being delet
371b0 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  ed.  */.  if( pC
371c0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
371d0 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
371e0 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
371f0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
37200 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ot, pCur->info.n
37210 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
37220 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75  iCellDepth = pCu
37230 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c  r->iPage;.  iCel
37240 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  lIdx = pCur->aiI
37250 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a  dx[iCellDepth];.
37260 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
37270 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74  apPage[iCellDept
37280 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69  h];.  pCell = fi
37290 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
372a0 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49  ellIdx);..  /* I
372b0 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  f the page conta
372c0 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20  ining the entry 
372d0 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
372e0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f   a leaf page, mo
372f0 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
37300 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  or to the larges
37310 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
37320 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ree that is smal
37330 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68  ler than.  ** th
37340 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65  e entry being de
37350 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c  leted. This cell
37360 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68   will replace th
37370 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  e cell being del
37380 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  eted.  ** from t
37390 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
373a0 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27  . The 'previous'
373b0 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66   entry is used f
373c0 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a  or this instead.
373d0 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78    ** of the 'nex
373e0 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65  t' entry, as the
373f0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
37400 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74  is always a part
37410 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62   of the.  ** sub
37420 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20  -tree headed by 
37430 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f  the child page o
37440 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  f the cell being
37450 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d   deleted. This m
37460 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63  akes.  ** balanc
37470 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c  ing the tree fol
37480 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74  lowing the delet
37490 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69  e operation easi
374a0 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  er.  */.  if( !p
374b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
374c0 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20    int notUsed;. 
374d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
374e0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
374f0 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  r, &notUsed);.  
37500 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37510 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
37520 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
37530 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20  ns of any other 
37540 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
37550 74 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f 72  this table befor
37560 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61 6e  e.  ** making an
37570 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 2e  y modifications.
37580 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20 63   Make the page c
37590 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
375a0 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  try to be .  ** 
375b0 64 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c 65  deleted writable
375c0 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79 20  . Then free any 
375d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
375e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
375f0 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20 61  he .  ** entry a
37600 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f 76  nd finally remov
37610 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  e the cell itsel
37620 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  f from within th
37630 65 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a 20  e page.  .  */. 
37640 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
37650 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
37660 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 3b  pgnoRoot, pCur);
37670 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
37680 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
37690 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
376a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
376b0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
376c0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63 6c  rn rc;.  rc = cl
376d0 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
376e0 43 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65 6c  Cell);.  dropCel
376f0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
37700 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
37710 50 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26 72  Page, pCell), &r
37720 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
37730 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
37740 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c 65  If the cell dele
37750 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63 61  ted was not loca
37760 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70 61  ted on a leaf pa
37770 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
37780 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72 72  sor.  ** is curr
37790 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
377a0 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e  o the largest en
377b0 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d 74  try in the sub-t
377c0 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a 20  ree headed.  ** 
377d0 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61 67  by the child-pag
377e0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  e of the cell th
377f0 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c 65  at was just dele
37800 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74 65  ted from an inte
37810 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20  rnal.  ** node. 
37820 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  The cell from th
37830 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65 64  e leaf node need
37840 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74 6f  s to be moved to
37850 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20 20   the internal.  
37860 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c 61  ** node to repla
37870 63 65 20 74 68 65 20 64 65 6c 65 74 65 64 20 63  ce the deleted c
37880 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ell.  */.  if( !
37890 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
378a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61     MemPage *pLea
378b0 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  f = pCur->apPage
378c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
378d0 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20     int nCell;.  
378e0 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72 2d    Pgno n = pCur-
378f0 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
37900 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  th+1]->pgno;.   
37910 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
37920 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c 6c  pTmp;..    pCell
37930 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61   = findCell(pLea
37940 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d  f, pLeaf->nCell-
37950 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  1);.    nCell = 
37960 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65 61  cellSizePtr(pLea
37970 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61  f, pCell);.    a
37980 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
37990 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c 20  IZE(pBt)>=nCell 
379a0 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65  );..    allocate
379b0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
379c0 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d 3e      pTmp = pBt->
379d0 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20 20  pTmpSpace;..    
379e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
379f0 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70 44  rWrite(pLeaf->pD
37a00 62 50 61 67 65 29 3b 0a 20 20 20 20 69 6e 73 65  bPage);.    inse
37a10 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  rtCell(pPage, iC
37a20 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c  ellIdx, pCell-4,
37a30 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20   nCell+4, pTmp, 
37a40 6e 2c 20 26 72 63 29 3b 0a 20 20 20 20 64 72 6f  n, &rc);.    dro
37a50 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  pCell(pLeaf, pLe
37a60 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65  af->nCell-1, nCe
37a70 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  ll, &rc);.    if
37a80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37a90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61  ;.  }..  /* Bala
37aa0 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66  nce the tree. If
37ab0 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
37ac0 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ed was located o
37ad0 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20  n a leaf page,. 
37ae0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72   ** then the cur
37af0 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  sor still points
37b00 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49   to that page. I
37b10 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
37b20 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  first.  ** call 
37b30 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70  to balance() rep
37b40 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61  airs the tree, a
37b50 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63  nd the if(...) c
37b60 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  ondition is.  **
37b70 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a   never true..  *
37b80 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
37b90 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64  , if the entry d
37ba0 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e  eleted was on an
37bb0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70   internal node p
37bc0 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70  age, then.  ** p
37bd0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
37be0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
37bf0 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65   from which a ce
37c00 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74  ll was removed t
37c10 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74  o.  ** replace t
37c20 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
37c30 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
37c40 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  l node. This is 
37c50 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72  slightly.  ** tr
37c60 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66  icky as the leaf
37c70 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64   node may be und
37c80 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20  erfull, and the 
37c90 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61  internal node ma
37ca0 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72  y.  ** be either
37cb0 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75   under or overfu
37cc0 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
37cd0 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69   run the balanci
37ce0 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a  ng algorithm.  *
37cf0 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f  * on the leaf no
37d00 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65  de first. If the
37d10 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64   balance proceed
37d20 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20  s far enough up 
37d30 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68  the.  ** tree th
37d40 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72  at we can be sur
37d50 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c  e that any probl
37d60 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  em in the intern
37d70 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a  al node has.  **
37d80 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c   been corrected,
37d90 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72   so be it. Other
37da0 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61  wise, after bala
37db0 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e  ncing the leaf n
37dc0 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74  ode,.  ** walk t
37dd0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65  he cursor up the
37de0 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74   tree to the int
37df0 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62  ernal node and b
37e00 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20  alance it as .  
37e10 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72  ** well.  */.  r
37e20 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
37e30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
37e40 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e  ITE_OK && pCur->
37e50 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
37e60 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
37e70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
37e80 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72  Depth ){.      r
37e90 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
37ea0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
37eb0 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20  age--]);.    }. 
37ec0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
37ed0 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
37ee0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37ef0 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
37f00 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
37f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37f20 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
37f30 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
37f40 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
37f50 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
37f60 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
37f70 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
37f80 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
37f90 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
37fa0 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
37fb0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
37fc0 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
37fd0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
37fe0 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
37ff0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
38000 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
38010 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
38020 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
38030 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
38040 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
38050 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
38060 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
38070 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
38080 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
38090 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
380a0 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
380b0 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
380c0 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
380d0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
380e0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
380f0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
38100 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
38110 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
38120 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
38130 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
38140 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
38150 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
38160 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
38170 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
38180 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
38190 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
381a0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
381b0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
381c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
381d0 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  M.  rc = allocat
381e0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
381f0 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
38200 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
38210 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
38220 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20   rc;.  }.#else. 
38230 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
38240 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
38250 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
38260 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
38270 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
38280 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
38290 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
382a0 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
382b0 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
382c0 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
382d0 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
382e0 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
382f0 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
38300 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
38310 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
38320 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
38330 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
38340 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
38350 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
38360 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
38370 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
38380 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
38390 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
383a0 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
383b0 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
383c0 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
383d0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
383e0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
383f0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
38400 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
38410 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
38420 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
38430 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
38440 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
38450 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
38460 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
38470 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
38480 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
38490 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
384a0 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
384b0 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page