/ Hex Artifact Content
Login

Artifact e3cd5ed99cdf946d9e95dd88dd09647746e472f5:


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 30 20 32 30 30 39 2f 30  c,v 1.700 2009/0
0190: 37 2f 32 32 20 31 38 3a 30 37 3a 34 31 20 64 72  7/22 18:07:41 dr
01a0: 68 20 45 78 70 20 24 0a 2a 2a 0a 2a 2a 20 54 68  h Exp $.**.** Th
01b0: 69 73 20 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e  is file implemen
01c0: 74 73 20 61 20 65 78 74 65 72 6e 61 6c 20 28 64  ts a external (d
01d0: 69 73 6b 2d 62 61 73 65 64 29 20 64 61 74 61 62  isk-based) datab
01e0: 61 73 65 20 75 73 69 6e 67 20 42 54 72 65 65 73  ase using BTrees
01f0: 2e 0a 2a 2a 20 53 65 65 20 74 68 65 20 68 65 61  ..** See the hea
0200: 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 22  der comment on "
0210: 62 74 72 65 65 49 6e 74 2e 68 22 20 66 6f 72 20  btreeInt.h" for 
0220: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
0230: 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 63 6c 75  mation..** Inclu
0240: 64 69 6e 67 20 61 20 64 65 73 63 72 69 70 74 69  ding a descripti
0250: 6f 6e 20 6f 66 20 66 69 6c 65 20 66 6f 72 6d 61  on of file forma
0260: 74 20 61 6e 64 20 61 6e 20 6f 76 65 72 76 69 65  t and an overvie
0270: 77 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  w of operation..
0280: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 62 74 72  */.#include "btr
0290: 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  eeInt.h"../*.** 
02a0: 54 68 65 20 68 65 61 64 65 72 20 73 74 72 69 6e  The header strin
02b0: 67 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  g that appears a
02c0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
02d0: 6f 66 20 65 76 65 72 79 0a 2a 2a 20 53 51 4c 69  of every.** SQLi
02e0: 74 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  te database..*/.
02f0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
0300: 72 20 7a 4d 61 67 69 63 48 65 61 64 65 72 5b 5d  r zMagicHeader[]
0310: 20 3d 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48   = SQLITE_FILE_H
0320: 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65  EADER;../*.** Se
0330: 74 20 74 68 69 73 20 67 6c 6f 62 61 6c 20 76 61  t this global va
0340: 72 69 61 62 6c 65 20 74 6f 20 31 20 74 6f 20 65  riable to 1 to e
0350: 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 75 73  nable tracing us
0360: 69 6e 67 20 74 68 65 20 54 52 41 43 45 0a 2a 2a  ing the TRACE.**
0370: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 30   macro..*/.#if 0
0380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
0390: 65 54 72 61 63 65 3d 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: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
e000: 49 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b  ITE_SharedCache;
e010: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
e020: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
e030: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e040: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
e050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e060: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
e070: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e080: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
e090: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
e0a0: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
e0b0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
e0c0: 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
e0d0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
e0e0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
e0f0: 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
e100: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e110: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
e120: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
e130: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e140: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e150: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
e160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e170: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
e180: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72  ared);.      for
e190: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
e1a0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
e1b0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
e1c0: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
e1d0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
e1e0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
e1f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e200: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
e210: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
e220: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
e230: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
e250: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
e260: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
e270: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
e280: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
e290: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
e2a0: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
e2b0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
e2c0: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
e2d0: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
e2e0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
e2f0: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
e300: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
e310: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
e320: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e330: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e340: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
e350: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e360: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
e370: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
e380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e390: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e3a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
e3b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e3c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e3d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e3e0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
e3f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e400: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
e410: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
e420: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
e430: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
e440: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
e450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
e460: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
e470: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
e480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e490: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e4a0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
e4b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
e4c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
e4d0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
e4e0: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
e4f0: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
e500: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
e510: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
e520: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
e530: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
e540: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
e550: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
e560: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
e570: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
e580: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e590: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
e5a0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
e5b0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
e5c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e5d0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
e5e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e5f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
e600: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
e610: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
e620: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
e630: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
e640: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
e650: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
e660: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
e670: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
e680: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
e690: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
e6a0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
e6b0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
e6c0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
e6d0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
e6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e6f0: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
e700: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
e710: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e720: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
e730: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
e740: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
e750: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
e760: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e770: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
e780: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e790: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
e7a0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
e7b0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
e7c0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
e7d0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e7e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e7f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e800: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
e820: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e830: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
e840: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
e850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e860: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
e870: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
e880: 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28  sFlags);.    if(
e890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e8a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
e8b0: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
e8c0: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
e8d0: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
e8e0: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
e8f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e900: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e910: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e920: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e930: 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  }.    pBt->db = 
e940: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
e950: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
e960: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
e970: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
e980: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
e990: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
e9a0: 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61    .    sqlite3Pa
e9b0: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70  gerSetReiniter(p
e9c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
e9d0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74  Reinit);.    pBt
e9e0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
e9f0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
ea00: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
ea10: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
ea20: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
ea30: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
ea40: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
ea50: 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65   get2byte(&zDbHe
ea60: 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69  ader[16]);.    i
ea70: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
ea80: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
ea90: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
eaa0: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
eab0: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
eac0: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
ead0: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
eae0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
eaf0: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
eb00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
eb10: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
eb20: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
eb30: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
eb40: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
eb50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
eb60: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
eb70: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
eb80: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
eb90: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
eba0: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
ebb0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
ebc0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
ebd0: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
ebe0: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
ebf0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
ec00: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
ec10: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
ec20: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
ec30: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
ec40: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
ec50: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
ec60: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
ec70: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
ec80: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
ec90: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
eca0: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
ecb0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
ecc0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
ecd0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
ece0: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
ecf0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
ed00: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
ed10: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ed20: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
ed30: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
ed40: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
ed50: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
ed60: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
ed70: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
ed80: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
ed90: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
eda0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
edb0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
edc0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
edd0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ede0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
edf0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
ee00: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ee10: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
ee20: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
ee30: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
ee40: 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
ee50: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ee60: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
ee70: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
ee80: 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
ee90: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
eea0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
eeb0: 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
eec0: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
eed0: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
eee0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
eef0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
ef00: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
ef10: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
ef20: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
ef30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ef40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ef50: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ef60: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ef70: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
ef80: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
ef90: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
efa0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
efb0: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
efc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
efd0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
efe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
eff0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
f000: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
f010: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
f020: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
f030: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f040: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
f050: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
f060: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
f070: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
f080: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
f090: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
f0a0: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
f0b0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
f0c0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
f0d0: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
f0e0: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
f0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
f100: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
f110: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
f120: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
f130: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
f140: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
f170: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
f180: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
f190: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
f1a0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f1b0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f1c0: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
f1d0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
f1e0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
f1f0: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
f200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f210: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
f220: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
f230: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
f240: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
f250: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
f260: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f270: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
f280: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
f290: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
f2a0: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
f2b0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
f2c0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
f2d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
f2e0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
f2f0: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
f300: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
f310: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
f320: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
f330: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
f340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f350: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
f360: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
f370: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
f380: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f390: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
f3a0: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
f3b0: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
f3c0: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
f3d0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
f3e0: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
f3f0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
f400: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
f410: 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
f420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
f430: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
f440: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
f450: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
f460: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
f470: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f480: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
f490: 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
f4a0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
f4b0: 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
f4c0: 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
f4d0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f4e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f4f0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
f500: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
f510: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
f520: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
f530: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
f540: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
f550: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
f560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f570: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
f580: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
f590: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f5a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f5b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
f5c0: 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
f5d0: 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
f5e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f5f0: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
f600: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
f610: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f620: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
f630: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
f640: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
f650: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f660: 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
f670: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ree = 0;.  }.  i
f680: 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
f690: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f6a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
f6b0: 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
f6c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f6d0: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
f6e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
f700: 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
f710: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
f720: 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
f730: 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
f740: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
f750: 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
f760: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
f770: 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
f780: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
f790: 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
f7a0: 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
f7b0: 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
f7c0: 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
f7d0: 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
f7e0: 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
f7f0: 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
f800: 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
f810: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
f820: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
f830: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
f840: 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
f850: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
f860: 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
f870: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f880: 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
f890: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
f8a0: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
f8b0: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f8c0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
f8d0: 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
f8e0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
f8f0: 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
f900: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
f910: 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
f920: 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
f930: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f940: 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
f950: 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
f960: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f970: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f980: 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
f990: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9a0: 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
f9b0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
f9c0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
f9d0: 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
f9e0: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
f9f0: 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
fa00: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
fa10: 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
fa20: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
fa30: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
fa40: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
fa50: 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
fa60: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
fa70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
fa80: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
fa90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
faa0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
fab0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
fac0: 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
fad0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
fae0: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
faf0: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
fb00: 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
fb10: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
fb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
fb30: 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
fb40: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
fb50: 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
fb60: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
fb70: 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
fb80: 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
fb90: 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
fba0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
fbb0: 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
fbc0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
fbd0: 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
fbe0: 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
fbf0: 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
fc00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
fc10: 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
fc20: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
fc30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
fc40: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
fc50: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
fc60: 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
fc70: 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
fc80: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
fc90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
fca0: 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
fcb0: 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
fcc0: 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
fcd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
fce0: 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
fcf0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
fd00: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
fd10: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
fd20: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
fd30: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
fd40: 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
fd50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
fd60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fd70: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
fd80: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
fd90: 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
fda0: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
fdb0: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
fdc0: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
fdd0: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
fde0: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
fdf0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
fe00: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
fe10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
fe20: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
fe30: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
fe40: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
fe50: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
fe60: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
fe70: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
fe80: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
fe90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
fea0: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
feb0: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
fec0: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
fed0: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
fee0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
fef0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
ff00: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
ff10: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
ff20: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
ff30: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
ff40: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
ff50: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
ff60: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
ff70: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
ff80: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
ff90: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
ffa0: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
ffb0: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
ffc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
ffd0: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
ffe0: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
fff0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10000 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10010 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10020 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10030 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10040 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10050 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10060 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10070 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10080 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10090 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
100a0 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
100b0 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
100c0 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
100d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
100e0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
100f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10100 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10110 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10120 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10130 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10140 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10150 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10160 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10170 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
10180 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
10190 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
101a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
101b0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
101c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
101d0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
101e0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
101f0 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
10200 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
10210 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
10220 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
10230 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
10240 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
10250 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
10260 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
10270 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
10280 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
10290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
102a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
102b0 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
102c0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
102d0 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
102e0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
102f0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
10300 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
10310 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
10320 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
10330 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
10340 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
10350 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
10360 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
10370 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
10380 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
10390 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
103a0 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
103b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
103c0 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
103d0 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
103e0 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
103f0 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
10400 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10410 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
10420 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
10430 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
10440 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
10450 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
10460 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
10470 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
10480 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
10490 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
104a0 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
104b0 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
104c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
104d0 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
104e0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
104f0 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
10500 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
10510 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
10520 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
10530 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
10540 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
10550 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
10560 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
10570 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
10580 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
10590 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
105a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
105b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
105c0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
105d0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
105e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
105f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
10600 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
10610 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
10620 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10630 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10650 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10660 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
10670 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
10680 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
10690 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
106a0 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
106b0 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
106c0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
106d0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
106e0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
106f0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
10700 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
10710 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
10720 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
10730 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
10740 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
10750 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
10760 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
10770 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
10780 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
10790 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
107a0 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
107b0 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
107c0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
107d0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
107e0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
107f0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
10800 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
10810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10820 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
10830 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10840 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
10850 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
10860 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
10870 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10880 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
10890 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
108a0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
108b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
108c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
108d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
108e0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
108f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
10900 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
10910 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10920 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
10950 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
10960 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
10970 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
10980 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
10990 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
109a0 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
109b0 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
109c0 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
109d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
109e0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
109f0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
10a00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10a10 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10a20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10a30 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
10a40 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
10a50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
10a70 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
10a80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10a90 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
10aa0 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
10ab0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ac0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10ad0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10ae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
10af0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
10b00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10b10 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
10b20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
10b30 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
10b40 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
10b50 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
10b60 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
10b70 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
10b80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10b90 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
10ba0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
10bb0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
10bc0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
10bd0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
10be0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
10bf0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
10c00 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
10c10 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
10c20 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
10c30 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
10c40 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
10c50 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
10c60 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
10c70 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
10c80 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
10c90 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
10ca0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
10cb0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
10cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10cd0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
10ce0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
10cf0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
10d00 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
10d10 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
10d20 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
10d30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
10d40 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
10d50 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
10d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
10d70 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
10d80 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
10d90 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
10da0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
10db0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
10dc0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
10dd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
10de0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
10df0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
10e00 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
10e10 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
10e20 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
10e30 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
10e40 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
10e50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10e60 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
10e70 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
10e80 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
10e90 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
10ea0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
10eb0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
10ec0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
10ed0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10ee0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
10ef0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
10f00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10f10 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
10f20 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
10f30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10f40 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
10f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10f60 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
10f70 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
10f80 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
10f90 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
10fa0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
10fb0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
10fc0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
10fd0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
10fe0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
10ff0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
11000 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11010 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
11020 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11030 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
11040 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
11050 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
11060 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
11070 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
11080 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
11090 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
110a0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
110b0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
110c0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
110d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
110e0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
110f0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11100 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11110 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11120 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11130 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11140 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11150 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11160 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
11170 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11180 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
111a0 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
111b0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
111c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
111d0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
111e0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
111f0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11210 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
11220 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
11230 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
11240 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61  y page that.** a
11250 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c  re intentually l
11260 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69  eft unused.  Thi
11270 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76  s is the "reserv
11280 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69  ed" space that i
11290 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75  s.** sometimes u
112a0 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e  sed by extension
112b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
112c0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
112d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
112e0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
112f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
11300 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
11310 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
11320 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69  ableSize;.  sqli
11330 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11340 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11350 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d  ./*.** Set the m
11360 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
11370 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  t for a database
11380 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
11390 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68  sitive..** No ch
113a0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
113b0 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72  f mxPage is 0 or
113c0 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65   negative..** Re
113d0 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
113e0 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c  value of mxPage,
113f0 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69   return the maxi
11400 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
11410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11420 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  reeMaxPageCount(
11430 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
11440 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  Page){.  int n;.
11450 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11460 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71  ter(p);.  n = sq
11470 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
11480 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70  eCount(p->pBt->p
11490 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
114a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
114b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
114c0 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   n;.}.#endif /* 
114d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
114e0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
114f0 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
11500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
11510 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
11520 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
11530 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
11540 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
11550 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
11560 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
11570 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
11580 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
11590 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
115a0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
115b0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
115c0 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
115d0 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
115e0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
115f0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
11600 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
11610 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
11620 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
11630 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
11640 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
11650 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
11660 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
11670 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11690 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
116a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
116b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
116c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
116d0 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
116e0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
116f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11700 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11710 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
11720 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
11730 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
11750 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
11760 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
11770 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
11780 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11790 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
117a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
117b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
117c0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
117d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
117e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
117f0 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
11800 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
11810 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
11820 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
11830 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
11840 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
11850 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
11860 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
11870 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
11880 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11890 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
118a0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
118b0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
118c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
118d0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
118e0 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
118f0 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
11900 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
11910 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
11920 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
11930 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
11940 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
11950 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
11960 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11970 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11980 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
11990 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
119a0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
119b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
119c0 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
119d0 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
119e0 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
119f0 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
11a00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
11a10 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
11a20 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
11a30 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
11a40 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
11a50 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
11a60 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
11a70 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
11a80 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
11a90 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
11aa0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
11ab0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
11ac0 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
11ad0 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
11ae0 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
11af0 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
11b00 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
11b10 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
11b20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e  *pPage1;.  int n
11b30 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
11b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11b50 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
11b70 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
11b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11b90 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
11ba0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
11bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
11bd0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
11be0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
11bf0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
11c00 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
11c10 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
11c20 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
11c30 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
11c40 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
11c50 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
11c60 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
11c70 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
11c80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
11c90 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11ca0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
11cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11cc0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
11cd0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11ce0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
11cf0 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
11d00 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
11d10 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
11d20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
11d30 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
11d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
11d50 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
11d60 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
11d70 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
11d80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
11d90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11db0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
11dc0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
11dd0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
11de0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
11df0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11e00 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11e10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11e20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
11e30 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
11e40 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
11e50 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
11e60 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
11e70 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
11e80 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
11e90 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
11ea0 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
11eb0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
11ec0 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
11ed0 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
11ee0 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
11ef0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
11f00 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
11f10 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
11f20 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
11f30 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
11f40 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
11f50 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
11f60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11f70 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11f80 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
11f90 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
11fa0 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
11fb0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
11fc0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
11fd0 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
11fe0 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
11ff0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
12000 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
12010 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
12020 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
12030 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12040 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12050 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
12060 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
12070 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
12080 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
12090 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
120a0 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
120b0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
120c0 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
120d0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
120e0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
120f0 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
12100 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
12110 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
12120 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
12130 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
12140 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
12150 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
12160 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
12170 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
12180 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
12190 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
121a0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
121b0 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
121c0 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
121d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
121e0 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
121f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
12200 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
12210 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
12220 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
12230 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12240 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53  e = (u16)usableS
12250 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
12260 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
12270 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
12280 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
12290 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
122a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
122b0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
122c0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
122d0 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
12300 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
12310 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12320 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
12330 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
12340 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12350 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12360 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
12370 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
12380 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
12390 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29  ableSize = (u16)
123a0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
123b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
123c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
123d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
123e0 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
123f0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
12400 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
12410 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
12420 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
12430 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
12440 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
12450 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
12460 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
12470 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
12480 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
12490 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
124a0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
124b0 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
124c0 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
124d0 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
124e0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
124f0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
12500 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
12510 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
12520 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
12530 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
12540 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
12550 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
12560 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
12570 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
12580 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
12590 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
125a0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
125b0 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
125c0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
125d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
125e0 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
125f0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
12600 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72   a 2-byte poiner
12610 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
12620 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
12630 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
12640 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
12650 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
12660 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
12670 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
12680 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
12690 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
126a0 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
126b0 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35  leSize-12)*64/25
126c0 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
126d0 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  inLocal = (pBt->
126e0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
126f0 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  2/255 - 23;.  pB
12700 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
12710 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
12720 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
12730 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
12740 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
12750 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20  - 23;.  assert( 
12760 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32  pBt->maxLeaf + 2
12770 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a  3 <= MX_CELL_SIZ
12780 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d  E(pBt) );.  pBt-
12790 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31  >pPage1 = pPage1
127a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
127b0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
127c0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
127d0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
127e0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
127f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
12800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
12810 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
12820 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
12830 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
12840 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
12850 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
12860 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
12870 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
12880 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
12890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
128a0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
128b0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
128c0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
128d0 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
128e0 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
128f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
12900 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
12910 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
12920 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
12930 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12940 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
12950 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
12960 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
12970 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
12980 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12990 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
129a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
129b0 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20  ->pCursor==0 || 
129c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
129d0 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
129e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
129f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
12a00 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
12a10 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61  age1!=0 ){.    a
12a20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
12a30 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
12a40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12a50 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
12a60 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
12a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
12a80 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
12a90 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
12aa0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b  ge(pBt->pPage1);
12ab0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
12ac0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
12ad0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12ae0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
12af0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
12b00 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
12b10 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
12b20 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
12b30 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
12b40 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
12b50 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
12b60 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
12b70 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
12b80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12b90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12ba0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12bb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12bc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
12bd0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
12be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12bf0 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
12c00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
12c10 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
12c20 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
12c30 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
12c40 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
12c50 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
12c60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
12c70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
12c80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12c90 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
12ca0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
12cb0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12cc0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
12cd0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12ce0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
12cf0 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
12d00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
12d10 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
12d20 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
12d30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12d40 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
12d50 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
12d60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
12d70 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
12d80 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
12d90 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
12da0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
12db0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
12dc0 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
12dd0 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
12de0 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
12df0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
12e00 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
12e10 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
12e20 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
12e30 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
12e40 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
12e50 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
12e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12e70 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
12e80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12e90 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
12ea0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
12eb0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
12ec0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
12ed0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
12ee0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12ef0 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
12f00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
12f10 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
12f20 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
12f30 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
12f40 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
12f50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12f60 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
12f70 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
12f80 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
12f90 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
12fa0 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
12fb0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
12fc0 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
12fd0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
12fe0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
12ff0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13000 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
13010 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
13020 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13030 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
13040 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
13050 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
13060 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13070 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13080 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13090 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
130a0 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
130b0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
130c0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
130d0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
130e0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
130f0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
13100 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
13110 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
13120 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
13130 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
13140 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
13150 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
13160 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13170 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13180 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13190 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
131a0 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
131b0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
131c0 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
131d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
131e0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
131f0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
13200 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
13210 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
13220 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
13230 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
13240 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
13250 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
13260 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13270 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13280 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13290 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
132a0 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
132b0 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
132c0 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
132d0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
132e0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
132f0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
13300 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
13310 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
13320 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
13330 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
13340 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
13350 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
13360 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13370 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13380 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13390 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
133a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
133b0 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
133c0 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
133d0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
133e0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
133f0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13400 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
13410 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
13420 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
13430 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
13440 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
13450 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
13460 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13470 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13480 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13490 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
134a0 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
134b0 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
134c0 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
134d0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
134e0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
134f0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
13500 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
13510 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
13520 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
13530 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
13540 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
13550 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
13560 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13570 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13580 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13590 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
135a0 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
135b0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
135c0 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
135d0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
135e0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
135f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13600 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
13610 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
13620 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
13630 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
13640 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13650 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
13660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13670 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13680 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13690 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
136a0 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
136b0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
136c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
136d0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
136e0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
136f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
13700 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
13710 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
13720 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
13730 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
13740 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13750 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13760 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13770 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13780 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13790 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
137a0 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
137b0 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
137c0 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
137d0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
137e0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
137f0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
13800 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
13810 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13820 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13830 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
13840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13850 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13860 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13870 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13880 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13890 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
138a0 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
138b0 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
138c0 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
138d0 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
138e0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
138f0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13900 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13910 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13920 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13930 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13940 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13950 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13960 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13970 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13980 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13990 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
139a0 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
139b0 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
139c0 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
139d0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
139e0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
139f0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13a00 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13a10 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13a30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13a40 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13a50 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13a60 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13a70 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13a80 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13a90 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13aa0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13ab0 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13ac0 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13ad0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13ae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13af0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13b00 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13b10 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13b20 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13b30 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13b40 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13b50 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13b60 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13b70 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13b80 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13b90 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13ba0 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13bb0 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13bc0 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13bd0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13be0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 64  rans_begun;..  d
13bf0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
13c00 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
13c10 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
13c20 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
13c30 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
13c40 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
13c50 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
13c60 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
13c70 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
13c80 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
13c90 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
13ca0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
13cb0 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
13cc0 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
13cd0 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
13ce0 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
13cf0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
13d00 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
13d10 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
13d20 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
13d30 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
13d40 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
13d50 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
13d60 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
13d70 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
13d80 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
13d90 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
13da0 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
13db0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
13dc0 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
13dd0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
13de0 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
13df0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
13e00 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
13e10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13e20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
13e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13e50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
13e60 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
13e70 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
13e80 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
13e90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13eb0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
13ec0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
13ed0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13ee0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21  }.  .    if( rc!
13ef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13f00 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
13f10 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
13f20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
13f30 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
13f40 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13f50 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
13f60 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
13f70 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
13f80 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
13f90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13fa0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
13fb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
13fc0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
13fd0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
13fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ff0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14000 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
14010 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73 65  harable ){..asse
14020 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
14030 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
14040 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
14050 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
14060 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
14070 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
14080 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
14090 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
140a0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
140b0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
140c0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
140d0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
140e0 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
140f0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
14100 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
14110 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14120 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
14130 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
14140 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
14150 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14160 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14170 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
14180 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14190 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
141a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
141b0 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
141c0 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
141d0 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e  e = (u8)(wrflag>
141e0 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
141f0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
14200 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
14210 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
14220 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
14230 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
14240 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
14250 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
14260 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
14270 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
14280 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
14290 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
142a0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
142b0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
142c0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
142d0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
142e0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
142f0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
14300 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14310 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
14320 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
14330 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
14340 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
14350 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
14360 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14370 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14380 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
14390 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
143a0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
143b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
143c0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
143d0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
143e0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
143f0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
14400 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
14410 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
14420 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
14430 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
14440 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
14450 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
14460 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
14470 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
14480 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
14490 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
144c0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
144d0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14500 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
14510 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
14520 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14540 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14550 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14560 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
14570 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14580 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14590 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
145a0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
145b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
145c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
145d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
145e0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
145f0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
14600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14610 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
14620 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
14630 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
14640 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
14650 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
14660 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
14670 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14680 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
14690 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
146a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
146b0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
146c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
146d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
146e0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
146f0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
14700 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
14710 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
14720 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
14730 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14740 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
14750 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
14760 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
14770 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
14780 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
14790 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
147a0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
147b0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
147c0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
147d0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
147e0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
147f0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
14800 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
14810 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
14820 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
14830 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
14840 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
14850 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
14860 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
14870 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
14880 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
14890 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
148a0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
148b0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
148c0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
148d0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
148e0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
148f0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14900 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14910 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
14940 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
14950 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
14960 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
14970 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
14980 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
14990 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
149a0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
149b0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
149c0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
149d0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
149e0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
149f0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
14a00 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
14a10 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
14a20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
14a30 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
14a40 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
14a50 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
14a60 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
14a70 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
14a80 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
14a90 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
14aa0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
14ab0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14ac0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
14ad0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14ae0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
14af0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
14b00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
14b10 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14b20 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
14b30 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
14b40 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
14b50 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14b60 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
14b70 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
14b80 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
14b90 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
14ba0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
14bb0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14bc0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
14bd0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
14be0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
14bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
14c00 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
14c10 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
14c20 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
14c30 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
14c40 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
14c50 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
14c60 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
14c70 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
14c80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
14c90 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14ca0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
14cb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
14cc0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
14cd0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
14ce0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
14cf0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
14d00 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
14d10 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
14d20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
14d30 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
14d40 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
14d50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14d60 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
14d70 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
14d80 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
14d90 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
14da0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14db0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14de0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
14df0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
14e00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
14e10 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
14e20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14e40 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
14e50 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
14e60 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
14e70 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
14e80 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
14e90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14ea0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
14eb0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
14ec0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14ed0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
14ee0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
14ef0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
14f00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
14f10 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
14f20 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
14f30 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
14f40 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
14f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14f60 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
14f70 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
14f80 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
14f90 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
14fa0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
14fb0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
14fc0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
14fd0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
14fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
14ff0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
15000 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
15010 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
15020 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
15030 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
15040 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
15050 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
15060 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15070 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15080 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15090 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
150a0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
150b0 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
150c0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
150d0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
150e0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
150f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
15100 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
15110 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
15120 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
15130 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
15140 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
15150 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15160 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15170 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15180 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15190 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
151a0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
151b0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
151c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
151d0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
151e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
151f0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
15200 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
15210 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
15220 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
15230 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
15240 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
15250 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
15260 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
15270 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
15280 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
15290 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
152a0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
152b0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
152c0 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
152d0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
152e0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
152f0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
15300 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
15310 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
15320 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
15330 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
15340 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
15350 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
15360 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
15370 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15380 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
153a0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
153b0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
153c0 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
153d0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
153e0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
153f0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
15400 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
15410 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
15420 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
15430 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
15440 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
15450 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
15460 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
15470 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
15480 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15490 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
154a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
154b0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
154c0 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
154d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
154f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
15500 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
15510 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
15520 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
15530 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
15540 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15550 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15560 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15570 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
15580 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15590 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
155a0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
155b0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
155c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
155d0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
155e0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
155f0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15600 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
15610 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
15620 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
15630 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
15640 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15650 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15660 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15670 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
15680 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15690 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
156a0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
156b0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
156c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
156d0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
156e0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
156f0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
15700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15710 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15720 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15730 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15740 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15750 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15760 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15770 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
15780 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15790 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
157a0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
157b0 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
157c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
157d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
157e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
157f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15800 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
15810 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
15820 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
15830 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
15840 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15850 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15860 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15870 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
15880 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15890 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
158a0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
158b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
158c0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
158d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
158e0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
158f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
15900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15910 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15920 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
15930 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15940 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
15950 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15970 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
15980 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
15990 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
159a0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
159b0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
159c0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
159d0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
159e0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
159f0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
15a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
15a20 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
15a30 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
15a40 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
15a50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15a60 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
15a70 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
15a80 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
15a90 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
15aa0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
15ab0 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
15ac0 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
15ad0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
15ae0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
15af0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
15b00 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
15b10 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
15b20 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
15b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15b40 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
15b50 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
15b60 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
15b70 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
15b80 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
15b90 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
15ba0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
15bb0 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
15bc0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
15bd0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
15be0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
15bf0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
15c00 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
15c10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
15c20 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
15c30 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
15c40 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
15c50 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
15c60 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
15c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
15c80 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
15c90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
15ca0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
15cb0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
15cc0 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
15cd0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
15ce0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
15cf0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
15d00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
15d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15d20 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
15d30 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
15d40 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
15d50 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
15d60 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
15d70 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
15d80 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
15d90 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
15da0 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
15db0 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
15dc0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
15dd0 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
15de0 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
15df0 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
15e00 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
15e10 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
15e20 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
15e30 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
15e40 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
15e50 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
15e60 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
15e70 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
15e80 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
15e90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
15ea0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
15eb0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
15ec0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15ed0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
15ee0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
15ef0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
15f00 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
15f10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15f20 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
15f30 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
15f40 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
15f50 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
15f60 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
15f70 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
15f80 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
15f90 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
15fa0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
15fb0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
15fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
15fd0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
15fe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
15ff0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
16000 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
16010 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
16020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
16040 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
16050 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16060 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
16070 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16080 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
160a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
160b0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
160c0 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
160d0 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
160e0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
160f0 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
16100 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
16110 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
16120 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
16130 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
16140 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
16150 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
16160 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
16170 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
16180 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
16190 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
161a0 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
161b0 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
161c0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
161d0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
161e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
161f0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
16200 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
16210 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
16220 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
16230 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
16240 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
16250 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
16260 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16280 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16290 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
162a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
162b0 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
162c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
162d0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
162e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
162f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
16300 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
16310 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
16320 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
16330 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
16340 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
16350 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
16360 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16370 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16380 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
16390 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
163a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
163b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
163c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
163d0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
163e0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
163f0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
16400 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
16410 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
16420 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
16430 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
16440 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
16450 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
16460 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
16470 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
16480 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
16490 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
164a0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
164b0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
164c0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
164d0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
164e0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
164f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
16500 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
16510 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
16520 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
16530 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
16540 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
16550 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
16560 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
16570 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16590 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
165a0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
165b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
165c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
165d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
165e0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
165f0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
16600 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
16610 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
16620 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
16630 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
16640 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16650 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
16660 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
16670 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16690 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
166a0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
166b0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
166c0 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
166d0 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
166e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
166f0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
16700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16720 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16730 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
16740 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
16750 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
16760 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
16770 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
16780 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
16790 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
167a0 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
167b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
167c0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
167d0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
167e0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  pPg;.        int
167f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
16800 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
16810 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20   &pPg, 0);.     
16820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16840 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16860 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16870 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
16880 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
16890 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
168a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
168b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
168d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
168e0 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   }.      iLastPg
168f0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  --;.    }.    sq
16900 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
16910 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
16920 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20  ger, iLastPg);. 
16930 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
16940 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16950 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
16960 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
16970 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
16980 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
16990 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
169a0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
169b0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
169c0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
169d0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
169e0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
169f0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
16a00 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
16a10 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
16a20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
16a30 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
16a40 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
16a50 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
16a60 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
16a70 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16a80 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
16a90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
16aa0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
16ab0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
16ac0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16ad0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
16ae0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16af0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16b00 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
16b10 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
16b20 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
16b30 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
16b40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
16b50 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
16b60 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
16b70 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
16b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16b90 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
16ba0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
16bb0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
16bc0 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70  umStep(pBt, 0, p
16bd0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
16be0 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t));.  }.  sqlit
16bf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
16c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16c10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16c20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
16c30 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
16c40 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
16c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
16c60 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
16c70 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
16c80 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
16c90 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
16ca0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
16cb0 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
16cc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16cd0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
16ce0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
16cf0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
16d00 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
16d10 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
16d20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
16d30 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
16d40 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
16d50 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
16d60 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
16d70 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
16d80 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
16d90 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
16da0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
16db0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16dc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16dd0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
16de0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
16df0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
16e00 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
16e10 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
16e20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16e30 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16e40 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
16e50 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
16e60 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
16e70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
16e80 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
16e90 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
16ea0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
16eb0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16ec0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
16ed0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
16ee0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
16ef0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
16f00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16f10 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
16f20 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
16f30 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70      Pgno nPtrmap
16f40 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
16f50 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
16f60 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
16f70 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
16f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
16f90 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
16fa0 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  eed */.    int n
16fb0 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a  Entry;        /*
16fc0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
16fd0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
16fe0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
16ff0 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
17000 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
17010 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
17020 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
17030 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
17040 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
17050 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17060 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
17070 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17080 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
17090 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
170a0 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
170b0 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
170c0 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
170d0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
170e0 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
170f0 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
17100 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
17110 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
17120 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
17130 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
17140 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
17150 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
17160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
17180 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
17190 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
171a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
171b0 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  .    nEntry = pB
171c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
171d0 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
171e0 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
171f0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
17200 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
17210 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  ntry;.    nFin =
17220 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
17230 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66   nPtrmap;.    if
17240 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
17250 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
17260 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
17270 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
17280 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  .      nFin--;. 
17290 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
172a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
172b0 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
172c0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
172d0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
172e0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a    nFin--;.    }.
172f0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
17300 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
17310 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17320 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  ..    for(iFree=
17330 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
17340 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
17350 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
17360 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
17370 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
17380 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d  n, iFree);.    }
17390 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
173a0 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
173b0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
173c0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
173d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
173e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
173f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
17400 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
17410 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
17420 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
17430 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
17440 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17450 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
17460 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
17470 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
17480 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
17490 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a  >pPager, nFin);.
174a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
174b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
174c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
174d0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
174e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
174f0 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
17500 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
17510 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
17520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
17530 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
17540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
17550 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
17560 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17570 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
17580 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
17590 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
175a0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
175b0 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
175c0 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
175d0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
175e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
175f0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
17600 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
17610 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
17620 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
17630 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
17640 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
17650 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
17660 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
17670 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
17680 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
17690 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
176a0 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
176b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
176c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
176d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
176e0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
176f0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
17700 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
17710 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
17720 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
17730 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
17740 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
17750 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17760 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
17770 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
17780 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
17790 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
177a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
177b0 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
177c0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
177d0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
177e0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
177f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17800 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
17810 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
17820 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
17830 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
17840 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
17850 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
17860 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
17870 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
17880 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
17890 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
178a0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
178b0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
178c0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
178d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
178e0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
178f0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
17900 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
17910 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17920 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
17930 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
17940 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
17950 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
17960 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
17970 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
17980 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
17990 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
179a0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
179b0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
179c0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
179d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
179e0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
179f0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
17a00 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
17a10 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
17a20 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
17a30 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
17a40 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
17a50 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
17a60 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
17a70 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
17a80 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
17a90 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
17aa0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
17ab0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
17ac0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
17ad0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
17ae0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17af0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
17b00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
17b10 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
17b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17b30 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
17b40 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
17b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17b60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
17b70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17b80 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
17b90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17ba0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
17bb0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
17bc0 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
17bd0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
17be0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17c00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17c10 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
17c20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17c30 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
17c40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17c50 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
17c60 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
17c70 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
17c80 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17c90 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
17ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17cb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17cc0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
17cd0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
17ce0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
17cf0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
17d00 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
17d10 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
17d20 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
17d30 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
17d40 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
17d50 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17d60 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17d70 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a  BtCursor *pCsr;.
17d80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17d90 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
17da0 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  (p) );..  /* Sea
17db0 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f 72  rch for a cursor
17dc0 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74 68   held open by th
17dd0 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65 63  is b-tree connec
17de0 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78 69  tion. If one exi
17df0 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  sts,.  ** then t
17e00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
17e10 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64 65  ill be downgrade
17e20 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79  d to a read-only
17e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
17e40 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74  * instead of act
17e50 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 2e  ually concluded.
17e60 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61   A subsequent ca
17e70 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61 73  ll to CommitPhas
17e80 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72 20  eTwo() .  ** or 
17e90 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c 20  Rollback() will 
17ea0 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73  finish the trans
17eb0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
17ec0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  k the database. 
17ed0 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d 70   */.  for(pCsr=p
17ee0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 73  Bt->pCursor; pCs
17ef0 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72 65  r && pCsr->pBtre
17f00 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72 2d  e!=p; pCsr=pCsr-
17f10 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65 72  >pNext);.  asser
17f20 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70 2d  t( pCsr==0 || p-
17f30 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
17f40 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  ONE );..  btreeC
17f50 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
17f60 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  Bt);.  if( pCsr 
17f70 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  ){.    downgrade
17f80 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
17f90 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
17fa0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
17fb0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
17fc0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
17fd0 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
17fe0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
17ff0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
18000 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
18010 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
18020 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
18030 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
18040 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
18050 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
18060 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
18070 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
18080 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
18090 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
180a0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
180b0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
180c0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
180d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
180e0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
180f0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
18100 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18110 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
18120 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
18130 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
18140 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18150 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
18160 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
18170 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
18180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18190 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
181a0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
181b0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
181c0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
181d0 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
181e0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
181f0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
18200 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
18210 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
18220 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
18230 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
18240 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18250 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
18260 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
18280 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18290 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
182a0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
182b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
182c0 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
182d0 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
182e0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
182f0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
18300 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18310 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
18320 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
18330 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
18340 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
18350 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
18360 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
18370 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18380 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
18390 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
183a0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
183b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
183c0 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
183d0 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
183e0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
183f0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
18400 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
18410 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
18420 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
18430 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
18440 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
18450 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
18460 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
18470 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
18480 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
18490 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
184a0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
184b0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
184c0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
184d0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
184e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
184f0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
18500 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
18510 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
18520 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
18530 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
18540 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18550 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
18560 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18570 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18580 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18590 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
185a0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
185b0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
185c0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
185d0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
185e0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
185f0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
18600 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
18610 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
18620 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
18630 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
18640 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18650 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
18660 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
18670 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18680 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
186a0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
186b0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
186c0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
186d0 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
186e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
186f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
18710 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18730 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
18740 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18750 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
18760 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
18770 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
18780 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18790 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
187a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
187b0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
187c0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
187d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
187e0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
187f0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
18800 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18810 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
18820 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
18830 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
18840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18860 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
18870 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
18880 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18890 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
188a0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
188b0 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
188c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
188d0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
188e0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
188f0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
18900 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
18910 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
18920 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
18930 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
18940 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
18950 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
18960 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
18970 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
18980 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
18990 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
189a0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
189b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
189c0 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
189d0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
189e0 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
189f0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
18a00 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
18a10 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
18a20 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
18a30 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
18a40 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
18a50 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
18a60 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
18a70 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
18a80 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18a90 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
18aa0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
18ab0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
18ac0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
18ad0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
18ae0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
18af0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
18b00 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
18b10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
18b20 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18b30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
18b40 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
18b50 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
18b60 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
18b70 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
18b80 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
18b90 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
18ba0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
18bb0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
18bc0 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
18bd0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
18be0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
18bf0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
18c00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18c10 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
18c20 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
18c30 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
18c40 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
18c50 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
18c60 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
18c70 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
18c80 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
18c90 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
18ca0 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
18cb0 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
18cc0 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
18cd0 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
18ce0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
18cf0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
18d00 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18d10 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
18d20 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
18d30 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
18d40 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
18d50 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
18d60 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
18d70 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
18d80 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
18d90 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
18da0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18db0 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
18dc0 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
18dd0 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
18de0 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
18df0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
18e00 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
18e10 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
18e20 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
18e30 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18e40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
18e50 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
18e60 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
18e70 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
18e80 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
18e90 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
18ea0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
18eb0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
18ec0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
18ed0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
18ee0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
18ef0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18f00 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
18f10 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
18f20 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
18f30 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
18f40 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
18f50 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
18f60 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
18f70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
18f80 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
18f90 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
18fa0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
18fb0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
18fc0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
18fd0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
18fe0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
18ff0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
19000 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
19010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19020 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
19030 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
19040 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
19050 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
19060 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
19070 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
19080 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
19090 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
190a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
190b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
190c0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
190d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
190e0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
190f0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
19100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19110 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
19120 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
19140 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
19150 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
19160 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
19170 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
19180 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
19190 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
191a0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
191b0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
191c0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
191d0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
191e0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
191f0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
19200 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
19210 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
19220 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
19230 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
19240 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
19250 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
19260 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
19270 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
19280 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
19290 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
192a0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
192b0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
192c0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
192d0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
192e0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
192f0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
19300 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
19310 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
19320 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
19330 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
19340 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
19350 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19360 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
19370 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
19380 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
19390 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
193a0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
193b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
193c0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
193d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
193e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
193f0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
19400 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
19410 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
19420 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
19430 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
19440 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
19450 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
19460 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
19470 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
19480 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
19490 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
194a0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
194b0 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
194c0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
194d0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
194e0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
194f0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
19500 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19510 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
19520 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
19530 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19540 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
19550 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
19560 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
19570 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19580 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19590 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
195a0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
195b0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
195c0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
195d0 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
195e0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
195f0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
19600 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
19610 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
19620 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
19630 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
19640 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
19650 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
19660 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
19670 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
19680 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
19690 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
196a0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
196b0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
196c0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
196d0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
196e0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
196f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
19700 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
19710 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
19720 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
19730 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
19740 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
19750 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
19760 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
19770 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
19780 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
19790 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
197a0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
197b0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
197c0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
197d0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
197e0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
197f0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
19800 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
19810 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
19820 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
19830 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
19840 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
19850 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
19860 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
19870 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
19880 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
19890 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
198a0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
198b0 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
198c0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
198d0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
198e0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
198f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
19900 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
19910 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
19920 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
19930 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
19940 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
19950 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
19960 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
19970 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
19980 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19990 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
199a0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
199b0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
199c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
199d0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
199e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
199f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
19a00 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19a10 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
19a20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
19a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19a40 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
19a50 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
19a60 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
19a70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45  oint );.  if( NE
19a80 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  VER(p->inTrans!=
19a90 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
19aa0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
19ab0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19ac0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c  _INTERNAL;.  }el
19ad0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
19ae0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19af0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
19b00 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65  );.    /* At the
19b10 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
19b20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
19b30 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
19b40 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a  oint with.    **
19b50 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
19b60 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
19b70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
19b80 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
19b90 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d     ** SQL statem
19ba0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
19bb0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
19bc0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
19bd0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
19be0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
19bf0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
19c00 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
19c10 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
19c20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
19c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19c40 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
19c50 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
19c60 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
19c70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19c80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19c90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
19ca0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
19cb0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
19cc0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
19cd0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
19ce0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
19cf0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
19d00 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
19d10 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
19d20 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
19d30 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
19d40 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
19d50 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
19d60 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
19d70 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
19d80 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
19d90 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
19da0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19db0 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
19dc0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
19dd0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
19de0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
19df0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
19e00 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
19e10 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
19e20 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
19e30 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
19e40 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
19e50 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
19e60 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
19e70 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
19e80 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
19e90 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
19ea0 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
19eb0 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
19ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19ed0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
19ee0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
19ef0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
19f00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19f10 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
19f20 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19f30 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
19f40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19f50 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
19f60 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
19f70 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
19f80 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
19f90 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
19fa0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
19fb0 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
19fc0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
19fd0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
19fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
19ff0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
1a000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a010 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
1a020 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
1a030 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
1a040 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a050 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  {.      rc = new
1a060 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1a070 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a080 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a090 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a0a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1a0b0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1a0c0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1a0d0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1a0e0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1a0f0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1a100 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1a110 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1a120 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1a130 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1a140 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1a150 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1a160 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1a170 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1a180 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1a190 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1a1a0 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1a1b0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1a1c0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1a1d0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a1e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1a1f0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1a200 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1a210 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1a220 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1a230 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1a240 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1a250 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1a260 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1a270 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1a280 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1a290 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1a2a0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1a2b0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1a2c0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1a2d0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1a2e0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1a2f0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1a300 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1a310 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1a320 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1a330 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1a340 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a350 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1a360 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1a370 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1a380 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1a390 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1a3a0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1a3b0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1a3c0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1a3d0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1a3e0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1a3f0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1a400 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1a410 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1a420 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1a430 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1a440 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1a450 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1a460 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a470 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1a480 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1a490 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1a4a0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1a4b0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1a4c0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1a4d0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1a4e0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1a4f0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1a500 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1a510 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1a520 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1a530 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1a540 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1a550 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1a560 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1a570 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1a580 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1a590 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1a5a0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1a5b0 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74  CursorSize() byt
1a5c0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a  es of memory .**
1a5d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
1a5e0 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65  Cur have been ze
1a5f0 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  roed by the call
1a600 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a610 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1a620 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1a650 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1a660 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1a690 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1a6a0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1a6d0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1a6e0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1a6f0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1a700 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1a710 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1a720 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1a730 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1a740 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1a770 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1a780 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a790 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1a7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1a7b0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1a7c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1a7d0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1a7e0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1a7f0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a800 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1a810 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1a820 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1a830 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1a840 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1a850 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1a860 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1a870 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1a880 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1a890 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1a8a0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1a8b0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1a8c0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1a8d0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1a8e0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1a8f0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1a900 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1a910 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1a920 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1a930 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1a940 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1a950 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1a960 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1a970 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1a980 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1a990 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1a9a0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1a9b0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1a9c0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1a9d0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1a9e0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1a9f0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1aa00 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1aa10 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1aa20 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1aa30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1aa40 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1aa50 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1aa60 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1aa70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1aa80 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1aa90 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1aaa0 3d 31 20 26 26 20 70 61 67 65 72 50 61 67 65 63  =1 && pagerPagec
1aab0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1aac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aad0 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1aae0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1aaf0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1ab00 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1ab10 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1ab20 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1ab30 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1ab40 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1ab50 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1ab60 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1ab70 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1ab80 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1ab90 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1aba0 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1abb0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1abc0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1abd0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1abe0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1abf0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1ac00 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1ac10 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1ac20 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1ac30 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1ac40 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1ac50 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1ac60 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1ac70 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1ac80 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1ac90 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1aca0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1acb0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1acc0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1acd0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad00 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1ad10 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ad40 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1ad50 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1ad60 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1ad90 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1ada0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1adb0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1adc0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1add0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1ade0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1adf0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1ae00 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1ae30 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1ae40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1ae50 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ae60 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1ae70 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1ae80 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1ae90 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1aea0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1aeb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1aec0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1aed0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1aee0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1aef0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1af00 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1af10 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1af20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1af30 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1af40 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1af50 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1af60 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1af70 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1af80 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1af90 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1afa0 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1afb0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1afc0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1afd0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1afe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1aff0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1b000 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69  id){.  return si
1b010 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a  zeof(BtCursor);.
1b020 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1b030 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1b040 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1b050 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1b060 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1b070 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1b080 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1b090 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1b0a0 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1b0b0 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1b0c0 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1b0d0 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1b0e0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1b0f0 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1b100 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1b110 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1b120 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1b130 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1b140 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1b150 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1b160 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1b170 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1b180 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1b190 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1b1a0 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1b1b0 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1b1c0 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1b1d0 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1b1e0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1b1f0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1b200 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1b210 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1b220 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1b230 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1b240 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1b250 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1b260 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1b270 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1b280 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1b290 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1b2a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1b2b0 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1b2c0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1b2d0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1b2e0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1b2f0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1b300 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1b310 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1b320 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1b330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1b340 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1b350 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1b360 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1b370 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1b380 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1b390 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1b3a0 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1b3b0 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1b3c0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1b3d0 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1b3e0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1b3f0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1b400 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1b410 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1b420 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1b430 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1b440 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1b450 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1b460 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1b470 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b480 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1b490 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1b4a0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1b4b0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1b4c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1b4d0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1b4e0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1b4f0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1b500 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1b510 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1b520 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1b530 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1b540 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1b550 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1b560 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1b570 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1b580 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1b590 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1b5a0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1b5b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1b5c0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1b5d0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1b5e0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1b5f0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1b600 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1b610 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1b620 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1b630 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1b640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b650 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1b660 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1b670 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1b680 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1b690 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1b6a0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1b6b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b6c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1b6d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1b6e0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1b6f0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1b700 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1b710 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1b720 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1b730 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1b740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1b750 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1b760 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b770 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1b780 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1b790 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1b7a0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1b7b0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1b7c0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1b7d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1b7e0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1b7f0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1b800 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1b810 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1b820 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1b830 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1b840 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1b850 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1b860 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1b870 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1b880 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1b890 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1b8a0 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1b8b0 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1b8c0 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1b8d0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1b8e0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1b8f0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1b900 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1b910 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1b920 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1b930 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1b940 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1b950 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1b960 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1b970 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1b980 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1b990 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1b9a0 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1b9b0 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1b9c0 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1b9d0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1b9e0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1b9f0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1ba00 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1ba10 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1ba20 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1ba30 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1ba40 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1ba50 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1ba60 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1ba70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ba80 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1ba90 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1baa0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1bab0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1bac0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1bad0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1bae0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1baf0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1bb00 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1bb10 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1bb20 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1bb30 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1bb40 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1bb50 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1bb60 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1bb70 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1bb80 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1bb90 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1bba0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1bbb0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1bbc0 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1bbd0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1bbe0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1bbf0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1bc00 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1bc10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1bc20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1bc30 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1bc40 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1bc50 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1bc60 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1bc70 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1bc80 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1bc90 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1bca0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1bcb0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1bcc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1bcd0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1bce0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1bcf0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1bd00 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1bd10 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1bd20 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1bd30 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1bd40 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1bd50 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bd90 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1bda0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1bdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bde0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1bdf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be30 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1be40 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1be50 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1be60 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1be70 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1be80 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1be90 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bec0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1bed0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf10 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1bf20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1bf30 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1bf70 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1bf80 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1bf90 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1bfa0 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1bfb0 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1bfc0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1bfd0 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1bfe0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1bff0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1c000 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1c010 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1c020 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1c030 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1c040 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1c050 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1c060 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1c070 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1c080 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1c090 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1c0a0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1c0b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1c0c0 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1c0d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1c0e0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1c0f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1c100 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1c110 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1c120 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1c130 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1c140 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1c150 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1c160 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1c170 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1c180 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1c190 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1c1a0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1c1b0 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1c1c0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1c1d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1c1e0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1c1f0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1c200 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c210 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1c220 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1c230 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1c240 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1c250 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1c260 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1c270 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1c280 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1c290 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1c2a0 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1c2b0 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1c2c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1c2d0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1c2e0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1c2f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1c300 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1c310 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c320 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c330 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c340 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1c350 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1c360 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1c370 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1c380 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1c390 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1c3a0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1c3b0 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1c3c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1c3d0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1c3e0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1c3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1c410 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1c420 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1c430 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1c440 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1c450 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1c460 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1c470 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1c480 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1c490 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1c4a0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1c4b0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1c4c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c4d0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1c4e0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1c4f0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1c500 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1c510 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1c520 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1c530 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1c540 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1c550 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1c560 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1c570 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1c580 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1c590 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1c5a0 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1c5b0 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1c5c0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1c5d0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1c5e0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1c5f0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1c600 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1c610 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1c620 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1c630 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1c640 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1c650 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c660 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1c670 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1c680 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1c690 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1c6a0 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1c6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c6c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1c6d0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1c6e0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1c6f0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1c700 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1c710 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1c720 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1c730 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1c740 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1c750 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1c760 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1c770 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1c780 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1c790 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1c7a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1c7b0 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1c7c0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1c7d0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1c7e0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1c7f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c800 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1c810 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1c820 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1c830 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1c840 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1c850 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1c860 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1c870 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1c880 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1c890 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1c8a0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1c8b0 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1c8c0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1c8d0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1c8e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1c8f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1c900 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1c910 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1c920 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1c930 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1c940 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1c950 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1c960 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1c970 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1c980 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1c990 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1c9a0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1c9b0 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1c9c0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1c9d0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1c9e0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1c9f0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1ca00 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1ca10 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1ca20 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1ca30 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1ca40 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1ca50 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1ca60 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1ca70 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1ca80 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1ca90 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1caa0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1cab0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1cac0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1cad0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1cae0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1caf0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1cb00 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1cb10 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1cb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1cb30 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1cb40 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1cb50 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1cb60 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1cb70 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1cb80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1cb90 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1cba0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1cbb0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1cbc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cbd0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1cbe0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1cbf0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1cc00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1cc10 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1cc20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1cc30 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1cc40 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1cc50 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1cc60 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1cc70 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1cc80 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1cc90 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1cca0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1ccb0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1ccc0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1ccd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1cce0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1ccf0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1cd00 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1cd10 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1cd20 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1cd30 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1cd40 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1cd50 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1cd60 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1cd70 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1cd80 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1cd90 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1cda0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1cdb0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1cdc0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1cdd0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1cde0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1cdf0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1ce00 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ce10 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1ce20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1ce30 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
1ce40 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1ce50 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1ce60 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1ce70 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1ce80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ce90 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1cea0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1ceb0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1cec0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1ced0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1cee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1cef0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1cf00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1cf10 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1cf20 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1cf30 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1cf40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cf50 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1cf60 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1cf70 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1cf80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1cf90 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1cfa0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1cfb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cfc0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1cfd0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1cfe0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1cff0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1d000 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1d010 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1d020 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1d030 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1d040 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1d050 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1d060 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1d070 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1d080 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1d090 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1d0a0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1d0b0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1d0c0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1d0d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1d0e0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1d0f0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d100 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1d110 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1d120 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1d130 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1d140 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1d150 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1d160 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1d170 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1d180 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1d190 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d1a0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1d1b0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1d1c0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1d1d0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1d1e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1d1f0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1d200 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1d210 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1d220 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1d230 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1d240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d250 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1d260 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1d270 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1d280 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1d290 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1d2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d2b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1d2c0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1d2d0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1d2e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d2f0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1d300 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d320 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1d330 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1d340 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1d350 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1d360 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1d370 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1d380 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1d390 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1d3a0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1d3b0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1d3c0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1d3d0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1d3e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1d3f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1d400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d410 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d420 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1d430 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1d440 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1d450 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1d460 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1d470 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1d480 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1d490 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1d4a0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1d4b0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1d4c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d4d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d4e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1d4f0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1d500 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1d510 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1d520 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1d530 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1d540 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1d550 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1d560 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1d570 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1d580 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1d590 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1d5a0 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1d5b0 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1d5c0 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1d5d0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1d5e0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1d5f0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1d600 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1d610 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1d620 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1d630 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1d640 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1d650 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1d660 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1d670 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1d680 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1d690 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1d6a0 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1d6b0 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1d6c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1d6d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1d6e0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1d6f0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1d700 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1d710 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1d720 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1d730 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1d740 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1d750 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1d760 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1d770 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1d780 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1d790 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1d7a0 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1d7b0 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1d7c0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1d7d0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1d7e0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1d7f0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1d800 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1d810 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1d820 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1d830 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1d840 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1d850 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1d860 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1d870 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1d880 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1d890 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1d8a0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1d8b0 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1d8c0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1d8d0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1d8e0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1d8f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1d900 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1d910 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1d920 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1d930 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1d940 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1d950 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1d960 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1d970 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1d980 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1d990 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1d9a0 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1d9b0 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1d9c0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1d9d0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1d9e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1d9f0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1da00 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1da10 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1da20 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1da30 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1da40 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1da50 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1da60 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1da70 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1da80 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1da90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1daa0 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1dab0 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1dac0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1dad0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1dae0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1daf0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1db00 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1db10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1db20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1db30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1db40 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1db50 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1db60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1db70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1db80 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1db90 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1dba0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1dbb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1dbc0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1dbd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1dbe0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1dbf0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1dc00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1dc10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1dc20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1dc30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1dc40 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1dc50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1dc60 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1dc70 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1dc80 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1dc90 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1dca0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1dcb0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1dcc0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1dcd0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1dce0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1dcf0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1dd00 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1dd10 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1dd20 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1dd30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1dd40 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1dd50 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1dd60 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1dd70 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1dd80 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1dd90 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1dda0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ddb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ddc0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ddd0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1dde0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ddf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1de00 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1de10 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1de20 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
1de30 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
1de40 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
1de50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1de60 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
1de70 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
1de80 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
1de90 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
1dea0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
1deb0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
1dec0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
1ded0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
1dee0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
1def0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
1df00 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1df10 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
1df20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1df30 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
1df40 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
1df50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1df60 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
1df70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1df80 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
1df90 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
1dfa0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1dfb0 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
1dfc0 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
1dfd0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
1dfe0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
1dff0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
1e000 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
1e010 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1e020 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
1e030 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e040 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
1e050 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
1e060 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
1e070 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
1e080 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
1e090 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
1e0a0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
1e0b0 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
1e0c0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
1e0d0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
1e0e0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
1e0f0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1e100 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
1e110 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
1e120 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
1e130 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
1e140 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
1e150 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
1e160 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
1e170 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
1e180 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
1e190 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
1e1a0 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
1e1b0 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
1e1c0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
1e1d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
1e1e0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
1e1f0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
1e200 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1e210 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
1e220 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
1e230 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
1e240 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
1e250 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
1e260 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
1e270 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
1e280 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
1e290 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
1e2a0 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
1e2b0 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
1e2c0 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
1e2d0 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
1e2e0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
1e2f0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
1e300 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
1e310 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
1e320 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
1e330 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
1e340 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1e350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1e360 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
1e370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1e380 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1e390 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
1e3a0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
1e3b0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
1e3c0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
1e3d0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
1e3e0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
1e3f0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
1e400 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
1e410 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
1e420 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1e430 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e440 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
1e450 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
1e460 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
1e470 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
1e480 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
1e490 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
1e4a0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
1e4b0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
1e4c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e4d0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
1e4e0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
1e4f0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
1e500 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
1e510 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1e520 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
1e530 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
1e540 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
1e550 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
1e560 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
1e570 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
1e580 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
1e590 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1e5a0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
1e5b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
1e5c0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
1e5d0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
1e5e0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
1e5f0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
1e600 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
1e610 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
1e620 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e630 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
1e640 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
1e650 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
1e660 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1e670 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1e680 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e690 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
1e6a0 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
1e6b0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
1e6c0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
1e6d0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
1e6e0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
1e6f0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
1e700 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
1e710 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
1e720 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
1e730 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
1e740 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
1e750 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
1e760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1e770 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
1e780 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1e790 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1e7a0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
1e7b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
1e7c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
1e7d0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
1e7e0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
1e7f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
1e800 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
1e810 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
1e820 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
1e830 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
1e840 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
1e850 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e860 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
1e870 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
1e880 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
1e890 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
1e8a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
1e8b0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
1e8c0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
1e8d0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
1e8e0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
1e8f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
1e900 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
1e910 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
1e920 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
1e930 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e940 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
1e950 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
1e960 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1e970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e980 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
1e990 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
1e9a0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
1e9b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
1e9c0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1e9d0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
1e9e0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
1e9f0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
1ea00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
1ea10 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
1ea20 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
1ea30 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1ea40 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
1ea50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
1ea60 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
1ea70 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ea80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ea90 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1eaa0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
1eab0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1eac0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
1ead0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1eae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eaf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1eb00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eb10 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1eb20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1eb30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1eb40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1eb50 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
1eb60 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
1eb70 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1eb80 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1eb90 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1eba0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1ebb0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1ebc0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1ebd0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1ebe0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
1ebf0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
1ec00 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
1ec10 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
1ec20 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
1ec30 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
1ec40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1ec50 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1ec60 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1ec70 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1ec80 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1ec90 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1eca0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1ecb0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1ecc0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1ecd0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1ece0 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
1ecf0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1ed00 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
1ed10 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
1ed20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ed30 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ed40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ed50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ed60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1ed70 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1ed80 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1ed90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1eda0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1edb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1edc0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
1edd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
1ede0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
1edf0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
1ee00 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
1ee10 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
1ee20 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
1ee30 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
1ee40 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
1ee50 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
1ee60 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
1ee70 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
1ee80 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
1ee90 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
1eea0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
1eeb0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
1eec0 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
1eed0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1eee0 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
1eef0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
1ef00 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
1ef10 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
1ef20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
1ef30 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
1ef40 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
1ef50 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
1ef60 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1ef70 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
1ef80 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1ef90 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
1efa0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
1efb0 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
1efc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
1efd0 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
1efe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1eff0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
1f000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
1f010 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
1f020 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1f030 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f040 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1f050 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1f060 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1f070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f080 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1f090 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f0a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
1f0b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
1f0c0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
1f0d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f0e0 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
1f0f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1f100 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
1f110 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f120 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
1f130 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
1f140 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
1f150 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
1f160 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f170 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1f180 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1f190 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1f1a0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
1f1b0 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
1f1c0 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1f1d0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
1f1e0 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
1f1f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1f200 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
1f210 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
1f220 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
1f230 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
1f240 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
1f250 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
1f260 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
1f270 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
1f280 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
1f290 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
1f2a0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
1f2b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
1f2c0 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
1f2d0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
1f2e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f2f0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
1f300 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
1f310 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
1f320 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
1f330 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
1f340 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
1f350 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
1f360 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
1f370 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
1f380 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
1f390 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
1f3a0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
1f3b0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
1f3c0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
1f3d0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
1f3e0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
1f3f0 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
1f400 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
1f410 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
1f420 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
1f430 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
1f440 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
1f450 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
1f460 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
1f470 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
1f480 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
1f490 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
1f4a0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
1f4b0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
1f4c0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1f4d0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
1f4e0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
1f4f0 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
1f500 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
1f510 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1f520 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
1f530 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1f540 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
1f550 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1f560 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1f570 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1f580 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1f590 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
1f5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1f5b0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
1f5c0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
1f5d0 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
1f5e0 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
1f5f0 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
1f600 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
1f610 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
1f620 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1f630 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
1f640 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1f650 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
1f660 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
1f670 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
1f680 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
1f690 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1f6a0 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
1f6b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f6c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f6e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f6f0 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
1f700 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1f710 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
1f720 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1f730 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1f740 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1f750 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
1f760 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
1f770 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
1f780 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1f790 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f7a0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
1f7b0 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1f7d0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
1f7e0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
1f7f0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
1f800 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
1f810 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f820 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
1f830 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
1f840 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
1f850 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
1f860 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1f870 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
1f880 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
1f890 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
1f8a0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1f8b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
1f8c0 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
1f8d0 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
1f8e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
1f8f0 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
1f900 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
1f910 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
1f920 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
1f930 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
1f940 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
1f950 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
1f960 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
1f970 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
1f980 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
1f990 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
1f9a0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
1f9b0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
1f9c0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
1f9d0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
1f9e0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
1f9f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1fa00 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
1fa10 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
1fa20 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
1fa30 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
1fa40 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
1fa50 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
1fa60 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
1fa70 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
1fa80 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
1fa90 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
1faa0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
1fab0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
1fac0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
1fad0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
1fae0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
1faf0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
1fb00 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1fb10 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
1fb20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
1fb30 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
1fb40 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1fb50 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
1fb60 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
1fb70 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
1fb80 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1fb90 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
1fba0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1fbb0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
1fbc0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
1fbd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fbe0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1fbf0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1fc00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1fc10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fc20 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
1fc30 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
1fc40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
1fc50 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
1fc60 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1fc70 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1fc80 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1fc90 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
1fca0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
1fcb0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
1fcc0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1fcd0 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
1fce0 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
1fcf0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1fd00 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1fd10 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1fd20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1fd30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fd40 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
1fd50 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
1fd60 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
1fd70 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
1fd80 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
1fd90 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
1fda0 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
1fdb0 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
1fdc0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1fdd0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
1fde0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
1fdf0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
1fe00 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
1fe10 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
1fe20 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
1fe30 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
1fe40 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
1fe50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1fe60 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
1fe70 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
1fe80 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
1fe90 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
1fea0 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
1feb0 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
1fec0 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
1fed0 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
1fee0 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
1fef0 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
1ff00 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
1ff10 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
1ff20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1ff30 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
1ff40 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
1ff50 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
1ff60 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
1ff70 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
1ff80 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
1ff90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ffa0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
1ffb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1ffc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1ffd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ffe0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1fff0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
20000 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
20010 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
20020 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
20030 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
20040 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
20050 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20060 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20070 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
20080 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
20090 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
200a0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
200b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
200c0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
200d0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
200e0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
200f0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
20100 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
20110 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
20120 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
20130 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
20140 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
20150 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
20160 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
20170 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
20180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20190 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
201a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
201b0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
201c0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
201d0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
201e0 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
201f0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
20200 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
20210 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
20220 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
20230 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
20240 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
20250 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
20260 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
20270 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
20280 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
20290 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
202a0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
202b0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
202c0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
202d0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
202e0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
202f0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
20300 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
20310 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
20320 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
20330 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
20340 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
20350 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
20360 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
20370 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
20380 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
20390 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
203a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
203b0 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
203c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
203d0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
203e0 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
203f0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
20400 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
20410 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
20420 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
20430 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
20440 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
20450 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
20460 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
20470 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
20480 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
20490 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
204a0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
204b0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
204c0 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
204d0 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
204e0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
204f0 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
20500 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
20510 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
20520 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
20530 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
20540 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
20550 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
20560 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
20570 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20580 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
20590 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
205a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
205b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
205c0 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
205d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
205e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
205f0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
20600 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
20610 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20620 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
20630 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20640 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
20650 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
20660 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
20670 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
20680 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
20690 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
206a0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
206b0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
206c0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
206d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
206e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
206f0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
20700 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
20710 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
20720 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
20730 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
20740 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
20750 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
20760 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20770 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
20780 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
20790 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
207a0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
207b0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
207c0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
207d0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
207e0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
207f0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
20800 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
20810 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
20820 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
20830 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
20840 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
20850 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
20860 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
20870 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
20880 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
20890 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
208a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
208b0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
208c0 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
208d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
208e0 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
208f0 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
20900 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
20910 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
20920 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
20930 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
20940 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
20950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
20960 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
20970 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
20980 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
20990 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
209a0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
209b0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
209c0 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
209d0 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
209e0 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
209f0 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
20a00 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
20a10 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
20a20 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
20a30 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
20a40 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
20a50 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
20a60 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
20a70 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
20a80 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
20a90 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
20aa0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
20ab0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
20ac0 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
20ad0 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
20ae0 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
20af0 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
20b00 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
20b10 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
20b20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
20b30 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
20b40 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20b50 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
20b60 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
20b70 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20b80 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
20b90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20ba0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20bb0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
20bc0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
20bd0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
20be0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
20bf0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
20c00 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
20c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
20c20 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
20c30 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20c40 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
20c50 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
20c60 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
20c70 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
20c80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
20c90 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
20ca0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
20cb0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
20cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
20cd0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
20ce0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
20cf0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
20d00 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
20d10 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
20d20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
20d30 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43    for(i=1; i<=pC
20d40 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
20d50 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20d60 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
20d70 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  i]);.    }.    p
20d80 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
20d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20da0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
20db0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
20dc0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
20dd0 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28  age[0]);.    if(
20de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20df0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
20e00 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
20e10 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
20e20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
20e30 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
20e40 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  0;..    /* If pC
20e50 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
20e60 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
20e70 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
20e80 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
20e90 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65  r.    ** expecte
20ea0 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
20eb0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
20ec0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
20ed0 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a  KeyInfo is.    *
20ee0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
20ef0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
20f00 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
20f10 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
20f20 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  se,.    ** retur
20f30 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
20f40 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20  UPT error.  */. 
20f50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20f60 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
20f70 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61  ey==1 || pCur->a
20f80 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
20f90 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ==0 );.    if( (
20fa0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
20fb0 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  0)!=pCur->apPage
20fc0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [0]->intKey ){. 
20fd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20fe0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21000 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
21010 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66   root page is of
21020 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
21030 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  e. This must be 
21040 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73  the.  ** case as
21050 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69   the call to thi
21060 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
21070 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d  loaded the root-
21080 70 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a  page (either.  *
21090 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61  * this call or a
210a0 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61   previous invoca
210b0 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65  tion) would have
210c0 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
210d0 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68  tion .  ** if th
210e0 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72  e assumption wer
210f0 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
21100 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
21110 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73  le for the flags
21120 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68   .  ** byte to h
21130 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ave been modifie
21140 64 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72  d while this cur
21150 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  sor is holding a
21160 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20   reference.  ** 
21170 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f  to the page.  */
21180 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
21190 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
211a0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
211b0 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
211c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
211d0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20  Root->isInit && 
211e0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
211f0 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)==pRoot->intK
21200 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61  ey );..  pCur->a
21210 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
21220 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
21230 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c  = 0;.  pCur->atL
21240 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ast = 0;.  pCur-
21250 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
21260 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
21270 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
21280 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
21290 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
212a0 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
212b0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
212c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
212d0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
212e0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
212f0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
21300 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
21310 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
21320 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
21330 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
21340 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
21350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
21360 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
21370 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
21380 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
21390 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
213a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
213b0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
213c0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
213d0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
213e0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
213f0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
21400 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
21410 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
21420 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
21430 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
21440 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
21450 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
21460 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
21470 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
21480 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
21490 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
214a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
214b0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
214c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
214d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
214e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
214f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21500 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21510 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21520 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21530 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21540 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
21550 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21560 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
21570 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
21580 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21590 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
215a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
215b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
215c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
215d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
215e0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
215f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
21600 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
21610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21620 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
21630 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
21640 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
21650 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
21660 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
21670 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
21680 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
21690 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
216a0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
216b0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
216c0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
216d0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
216e0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
216f0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
21700 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
21710 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
21720 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
21730 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
21740 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
21750 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
21760 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
21770 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
21780 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
21790 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
217a0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
217b0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
217c0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
217d0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
217e0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
217f0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
21800 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
21810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
21820 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
21830 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21840 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21850 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21860 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21870 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21880 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
21890 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
218a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
218b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
218c0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
218d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
218e0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
218f0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
21900 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
21910 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
21920 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
21930 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
21940 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
21950 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
21960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
21970 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21980 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
21990 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
219a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
219b0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
219c0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
219d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
219e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
219f0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
21a00 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
21a10 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
21a20 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
21a30 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
21a40 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
21a50 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
21a60 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
21a70 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
21a80 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
21a90 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
21aa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
21ab0 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
21ac0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
21ad0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
21ae0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21af0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21b00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21b10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
21b20 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
21b30 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
21b40 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
21b50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21b70 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21b80 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
21b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21ba0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21bb0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21bc0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
21bd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
21be0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21c00 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
21c10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21c20 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
21c30 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
21c40 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
21c50 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
21c60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
21c70 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
21c80 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21c90 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
21ca0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
21cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
21cc0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
21cd0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
21ce0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
21cf0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
21d00 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
21d10 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
21d20 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
21d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21d40 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
21d50 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
21d60 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
21d70 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
21d80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21d90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21da0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21db0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
21dc0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
21dd0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
21de0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
21df0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
21e00 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
21e10 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
21e20 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
21e30 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75  r->eState && pCu
21e40 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66  r->atLast ){.#if
21e50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21e60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
21e70 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
21e80 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
21e90 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
21ea0 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
21eb0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
21ec0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
21ed0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
21ee0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
21ef0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
21f00 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
21f10 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
21f20 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
21f30 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
21f40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
21f50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21f60 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
21f70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21f80 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
21f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21fa0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21fb0 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
21fc0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
21fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
21fe0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
21ff0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
22000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22010 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
22020 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
22030 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
22040 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22050 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22060 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
22070 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
22080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22090 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
220a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
220b0 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
220c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
220d0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
220e0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
220f0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
22100 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
22110 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
22120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
22130 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22140 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
22150 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
22160 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
22170 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
22180 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
22190 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
221a0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
221b0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
221c0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
221d0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
221e0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
221f0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
22200 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
22210 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
22220 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
22230 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
22240 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
22250 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
22260 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
22270 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
22280 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
22290 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
222a0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
222b0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
222c0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
222d0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
222e0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
222f0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
22300 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
22310 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
22320 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
22330 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
22340 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
22350 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
22360 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
22370 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
22380 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
22390 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
223a0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
223b0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
223c0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
223d0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
223e0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
223f0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
22400 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
22410 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
22420 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22430 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
22440 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
22450 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
22460 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
22490 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
224a0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
224b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
224c0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
224d0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
224e0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
224f0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
22500 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
22510 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
22520 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
22530 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
22540 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
22550 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
22560 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
22570 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22580 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
22590 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
225a0 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
225b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
225c0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
225d0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
225e0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
225f0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
22600 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
22610 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
22620 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
22630 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
22640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22650 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
22660 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
22670 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
22680 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
22690 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
226a0 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
226b0 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
226c0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
226d0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
226e0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
226f0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
22700 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22710 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22720 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22730 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22740 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
22760 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
22770 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
22780 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
22790 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
227a0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
227b0 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
227c0 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
227d0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
227e0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
227f0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
22800 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
22810 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
22820 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22830 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
22840 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
22850 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
22860 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
22870 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
22880 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
22890 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
228a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
228b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
228c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
228d0 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
228e0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
228f0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
22900 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
22910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22920 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
22930 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
22940 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22950 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22970 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22980 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
22990 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
229a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
229b0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
229c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
229d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
229e0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
229f0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
22a00 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
22a10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22a20 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
22a30 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
22a40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22a50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22a60 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
22a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22a80 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
22a90 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
22aa0 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
22ab0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
22ac0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
22ad0 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
22ae0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
22af0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
22b00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22b10 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b  age];.    int c;
22b20 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
22b30 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
22b40 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
22b50 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
22b60 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
22b70 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
22b80 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
22b90 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
22ba0 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
22bb0 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
22bc0 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
22bd0 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
22be0 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
22bf0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
22c00 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
22c10 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
22c20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
22c30 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
22c40 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
22c50 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
22c60 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
22c70 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
22c80 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
22c90 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
22ca0 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
22cb0 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
22cc0 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
22cd0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
22ce0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
22cf0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
22d00 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
22d10 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
22d20 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
22d30 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
22d40 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
22d50 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
22d60 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
22d70 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
22d80 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c  u16)upr;.    }el
22d90 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
22da0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22db0 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b  e] = (u16)((upr+
22dc0 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
22dd0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
22de0 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
22df0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22e00 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f  age]; /* Index o
22e10 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  f current cell i
22e20 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20  n pPage */.     
22e30 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e50 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22e60 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
22e70 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
22e80 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
22e90 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
22ea0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
22eb0 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
22ec0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
22ed0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
22ee0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
22ef0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
22f00 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
22f10 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
22f20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
22f30 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
22f40 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
22f50 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
22f60 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
22f70 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
22f80 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
22f90 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
22fa0 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
22fb0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22fc0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
22fd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
22fe0 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
22ff0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
23000 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23010 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23020 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
23030 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
23040 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
23050 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
23060 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
23070 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
23080 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
23090 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
230a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
230b0 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
230c0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32   page-size is 32
230d0 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20  768 bytes. This 
230e0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
230f0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
23100 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
23110 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
23120 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
23130 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
23140 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31  ge is at most 81
23150 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  98 bytes, which 
23160 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
23170 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
23180 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
23190 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
231a0 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
231b0 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
231c0 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
231d0 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
231e0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
231f0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
23200 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
23210 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
23220 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
23230 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
23240 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
23250 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
23260 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
23270 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
23280 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
23290 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
232a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e  .        if( !(n
232b0 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20  Cell & 0x80) && 
232c0 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
232d0 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
232e0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
232f0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
23300 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
23310 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
23320 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
23330 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
23340 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
23350 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
23360 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
23370 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
23380 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
23390 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
233a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
233b0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
233c0 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
233d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
233e0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
233f0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
23400 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
23410 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
23420 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
23430 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
23440 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
23450 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
23460 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
23470 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
23480 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
23490 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
234a0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
234b0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
234c0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
234d0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
234e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
234f0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
23500 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
23510 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23530 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
23540 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
23550 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
23560 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
23570 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
23580 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
23590 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
235a0 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
235b0 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
235c0 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
235d0 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
235e0 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
235f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
23600 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
23610 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
23620 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
23630 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
23640 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
23650 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
23660 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
23670 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
23680 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
23690 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
236a0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
236b0 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
236c0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
236d0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
236e0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
236f0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
23700 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
23710 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
23720 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
23730 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
23740 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23750 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23760 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
23770 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
23780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23790 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
237a0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
237b0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
237c0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
237d0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
237e0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
237f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
23800 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
23810 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
23820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23830 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
23840 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
23850 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
23860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23870 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
23880 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
23890 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
238a0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
238b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
238c0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
238d0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
238e0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
238f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
23900 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
23910 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23930 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
23940 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
23950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23960 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
23970 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
23980 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
23990 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
239a0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
239b0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
239c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
239d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
239e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
239f0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
23a00 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
23a10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
23a20 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
23a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23a40 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
23a50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
23a60 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
23a70 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
23a80 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
23a90 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
23aa0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
23ab0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
23ac0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
23ad0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
23ae0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
23af0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
23b00 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
23b10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
23b20 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
23b30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23b40 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23b50 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
23b60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
23b70 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ll );.      *pRe
23b80 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
23b90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23ba0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
23bb0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
23bc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23bd0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
23be0 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
23bf0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
23c00 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
23c10 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
23c20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
23c30 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
23c40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
23c50 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
23c60 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
23c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23c80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
23c90 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
23ca0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
23cb0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
23cc0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
23cd0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
23ce0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
23cf0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
23d00 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
23d10 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
23d20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
23d30 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
23d40 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
23d50 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
23d60 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
23d70 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
23d80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
23d90 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
23da0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
23db0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23dc0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
23dd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
23de0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
23df0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
23e00 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
23e10 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
23e20 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
23e30 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
23e40 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
23e50 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
23e60 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
23e70 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
23e80 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
23e90 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
23ea0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
23eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
23ec0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
23ed0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
23ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
23ef0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
23f00 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
23f10 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
23f20 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
23f30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
23f40 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
23f50 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
23f60 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
23f70 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
23f80 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
23f90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23fa0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
23fb0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
23fc0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
23fd0 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
23fe0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
23ff0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24000 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24010 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
24020 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
24030 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
24040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24060 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
24070 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
24080 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
24090 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
240a0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
240b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
240c0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
240d0 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
240e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
240f0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
24100 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
24110 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24120 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24130 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
24140 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24150 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
24160 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
24170 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
24180 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
24190 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
241a0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
241b0 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
241c0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
241d0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
241e0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
241f0 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
24200 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
24210 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
24220 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24230 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
24240 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
24250 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
24260 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
24270 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
24280 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
24290 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
242a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
242b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
242c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
242d0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
242e0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
242f0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
24300 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
24310 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24320 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
24330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
24350 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
24360 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
24370 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24380 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
24390 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
243a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
243b0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
243c0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
243d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
243e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
243f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
24400 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
24410 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24430 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
24440 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
24450 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
24460 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
24470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24480 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
24490 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
244a0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
244b0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65  c;.}.../*.** Ste
244c0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
244d0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
244e0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
244f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
24500 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
24510 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
24520 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
24530 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
24540 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
24550 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
24560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
24570 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
24580 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
24590 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
245a0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
245b0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
245c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
245d0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
245e0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
245f0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
24600 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24610 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
24620 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
24630 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
24640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24650 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
24660 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
24670 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
24680 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
24690 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
246a0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
246b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
246c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
246d0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
246e0 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  t<0 ){.    pCur-
246f0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
24700 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24720 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  OK;.  }.  pCur->
24730 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20  skipNext = 0;.. 
24740 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
24750 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24760 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
24770 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
24780 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
24790 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
247a0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
247b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
247c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
247d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
247e0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
247f0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
24800 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
24810 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24820 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
24830 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
24840 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
24850 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
24860 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
24870 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
24880 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
24890 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
248a0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
248b0 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
248c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
248d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
248e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
248f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
24900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
24910 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
24920 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
24930 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20  idNKey = 0;..   
24940 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24950 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
24960 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
24970 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24980 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
24990 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
249a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
249b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
249c0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
249d0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
249e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
249f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24a00 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
24a10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24a20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
24a30 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
24a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24a50 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
24a60 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
24a70 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
24a80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
24a90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24aa0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
24ab0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
24ac0 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
24ad0 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
24ae0 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
24af0 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
24b00 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
24b10 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
24b20 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
24b30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
24b40 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
24b50 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
24b60 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
24b70 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
24b80 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
24b90 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
24ba0 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
24bb0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
24bc0 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
24bd0 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
24be0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
24bf0 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
24c00 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
24c10 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
24c20 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
24c30 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
24c40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
24c50 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
24c60 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20  s not 0, then a 
24c70 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20  (feeble) effort 
24c80 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
24c90 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
24ca0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
24cb0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
24cc0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
24cd0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
24ce0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
24cf0 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
24d00 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
24d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24d20 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
24d30 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
24d40 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
24d50 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
24d60 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65  e "exact" parame
24d70 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e  ter is not 0, an
24d80 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  d the page-numbe
24d90 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20  r nearby exists 
24da0 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
24db0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
24dc0 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e  hen it is guaren
24dd0 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
24de0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  ned. This.** is 
24df0 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74  only used by aut
24e00 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
24e10 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69  es when allocati
24e20 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a  ng a new table..
24e30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
24e40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
24e50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24e60 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  , .  MemPage **p
24e70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a  pPage, .  Pgno *
24e80 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e  pPgno, .  Pgno n
24e90 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63  earby,.  u8 exac
24ea0 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
24eb0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
24ec0 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
24ed0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
24ee0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
24ef0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
24f00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
24f10 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
24f20 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
24f30 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
24f40 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
24f50 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
24f60 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
24f70 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
24f80 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
24f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
24fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24fb0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24fc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
24fd0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
24fe0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
24ff0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
25000 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34  pBt);.  n = get4
25010 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
25020 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
25030 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
25040 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
25050 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
25060 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25070 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
25080 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
25090 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
250a0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
250b0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
250c0 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
250d0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
250e0 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
250f0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
25100 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
25110 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
25120 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
25130 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
25140 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
25150 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
25160 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
25170 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
25180 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
25190 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
251a0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
251b0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
251c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
251d0 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
251e0 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
251f0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
25200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25210 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25220 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
25230 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
25240 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
25250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
25260 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
25270 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
25280 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
25290 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
252a0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
252b0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
252c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
252d0 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
252e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
252f0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
25300 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
25310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
25320 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
25330 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
25340 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
25350 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
25360 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
25370 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
25380 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
25390 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
253a0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
253b0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
253c0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
253d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
253e0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
253f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
25400 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
25410 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
25420 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
25430 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
25440 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
25450 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
25460 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
25470 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
25480 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
25490 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
254a0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
254b0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
254c0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
254d0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
254e0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
254f0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
25500 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
25510 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
25520 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
25530 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
25540 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
25550 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
25560 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
25570 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
25580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
25590 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
255a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
255b0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
255c0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
255d0 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
255e0 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
255f0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
25600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
25610 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
25620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25630 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
25640 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
25650 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
25660 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
25670 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
25680 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
25690 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
256a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
256b0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
256c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
256d0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
256e0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
256f0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
25700 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
25710 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
25720 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
25730 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
25740 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
25750 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
25760 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
25770 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
25780 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
25790 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
257a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
257b0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
257c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
257d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
257e0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
257f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
25800 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
25810 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
25820 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
25830 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
25840 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
25850 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
25860 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25870 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25880 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
25890 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
258a0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
258b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
258c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
258d0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
258e0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
258f0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
25900 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25910 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
25920 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
25930 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
25940 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
25950 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
25960 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
25970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25980 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25990 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
259a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
259b0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
259c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
259d0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
259e0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
259f0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
25a00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
25a10 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
25a20 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
25a30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
25a40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
25a50 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
25a60 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
25a70 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
25a80 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
25a90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25aa0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
25ab0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
25ac0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
25ad0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
25ae0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
25af0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25b00 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
25b10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
25b20 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25b30 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25b40 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
25b50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
25b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25b70 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
25b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25b90 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
25ba0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
25bb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
25bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25bd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
25be0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
25bf0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
25c00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25c10 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
25c20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25c30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25c40 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
25c50 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
25c60 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
25c70 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
25c80 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
25c90 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
25ca0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
25cb0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
25cc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
25cd0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
25ce0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
25cf0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
25d00 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
25d10 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
25d20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
25d30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
25d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25d50 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
25d60 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
25d70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
25d80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
25d90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25da0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25db0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25dc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
25dd0 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
25de0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
25df0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
25e00 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
25e10 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
25e20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
25e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25e40 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25e50 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
25e60 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
25e70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
25e80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25e90 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
25ea0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
25eb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25ec0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
25ed0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
25ee0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
25ef0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25f00 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25f20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
25f30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
25f40 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25f50 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
25f60 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
25f70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
25f80 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
25f90 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
25fa0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
25fb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
25fc0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
25fd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25fe0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
25ff0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
26000 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
26010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
26020 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26030 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
26040 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
26050 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
26060 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
26070 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
26080 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
26090 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
260a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
260b0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
260c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
260d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
260e0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
260f0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26100 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
26110 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
26120 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
26130 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
26140 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
26150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26160 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
26170 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
26180 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
26190 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
261a0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
261b0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
261c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
261d0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
261e0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
261f0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
26200 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
26210 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
26220 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
26230 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
26240 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
26250 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
26260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
26270 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
26280 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
26290 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
262a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
262b0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
262c0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
262d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
262e0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
262f0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
26300 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
26310 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
26320 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
26330 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
26340 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
26350 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
26360 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
26370 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
26380 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
26390 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
263a0 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
263b0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
263c0 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
263d0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
263e0 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
263f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
26400 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
26410 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
26420 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
26430 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
26440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26470 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
26480 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26490 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
264a0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
264b0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
264c0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
264d0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
264e0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
264f0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
26500 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
26510 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
26520 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26530 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26540 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65      }.        te
26550 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
26560 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
26570 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
26580 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
26590 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
265a0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
265b0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
265c0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
265d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
265e0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
265f0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
26600 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
26610 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
26620 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
26630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26640 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
26650 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
26660 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
26670 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
26680 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
26690 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
266a0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
266b0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
266c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
266d0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
266e0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
266f0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -1);.          a
26700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
26710 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
26720 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20  Trunk->pDbPage) 
26730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
26740 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
26750 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
26760 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20  , *pPgno);.     
26770 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
26780 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
26790 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
267a0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ntent);.        
267b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
267c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
267d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
267e0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
267f0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
26800 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
26810 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
26830 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
26840 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26850 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
26860 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
26870 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
26880 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26890 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
268a0 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
268b0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
268c0 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
268d0 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
268e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
268f0 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
26900 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
26910 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  create a new pag
26920 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  e at the.    ** 
26930 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
26940 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
26950 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
26960 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50 67  t(pBt);.    *pPg
26970 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a  no = nPage + 1;.
26980 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d  .    if( *pPgno=
26990 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
269a0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
269b0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20   (*pPgno)++;.   
269c0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
269d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
269e0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
269f0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
26a00 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
26a10 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20   *pPgno) ){.    
26a20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
26a30 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
26a40 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
26a50 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
26a60 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
26a70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
26a80 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
26a90 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
26aa0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
26ab0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
26ac0 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
26ad0 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
26ae0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
26af0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
26b00 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
26b10 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
26b20 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
26b30 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
26b40 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
26b50 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67  p page)\n", *pPg
26b60 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  no));.      asse
26b70 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
26b80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
26b90 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
26ba0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
26bb0 74 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c  t, *pPgno, &pPg,
26bc0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
26bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26be0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26bf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26c00 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
26c10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26c20 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
26c30 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
26c40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
26c50 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
26c60 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
26c70 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26c80 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
26c90 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
26ca0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
26cb0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
26cc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26cd0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
26ce0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
26cf0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
26d00 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
26d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
26d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26d30 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
26d40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
26d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26d60 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
26d70 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
26d80 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
26d90 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
26da0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
26db0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
26dc0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
26dd0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
26de0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
26df0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
26e00 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
26e10 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
26e20 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
26e30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
26e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
26e50 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
26e60 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
26e70 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
26e80 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
26e90 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
26ea0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26eb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
26ed0 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
26ee0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
26ef0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
26f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26f10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26f20 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
26f30 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
26f40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26f50 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
26f60 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
26f70 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
26f80 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
26f90 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
26fa0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
26fb0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
26fc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26fd0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
26fe0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
26ff0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
27000 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
27010 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
27020 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
27030 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
27040 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
27050 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
27060 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
27070 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
27080 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
27090 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
270a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
270b0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
270c0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
270d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
270e0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
270f0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27100 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
27110 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
27120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
27130 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
27140 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
27150 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
27160 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
27170 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27190 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
271a0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
271b0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
271c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271d0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
271e0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
271f0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
27200 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
27210 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
27220 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
27230 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
27240 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27260 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
27270 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
27280 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
27290 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
272c0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
272f0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
27300 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
27310 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
27320 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27330 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
27340 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
27350 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
27360 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
27370 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
27380 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
27390 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
273a0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
273b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
273c0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
273d0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
273e0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
273f0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
27400 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
27410 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
27420 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
27430 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
27440 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27450 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
27460 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
27470 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
27480 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
27490 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
274a0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
274b0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
274c0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
274d0 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  +1);..#ifdef SQL
274e0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
274f0 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  E.  /* If the SQ
27500 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
27510 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TE compile-time 
27520 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
27530 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77  d, then.  ** alw
27540 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
27550 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
27560 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
27570 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  os..  */.  if( (
27580 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20  !pPage && (rc = 
27590 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
275a0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
275b0 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20 20 20   0))).   ||     
275c0 20 20 20 20 20 20 20 28 72 63 20 3d 20 73 71 6c         (rc = sql
275d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
275e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a  Page->pDbPage)).
275f0 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72    ){.    goto fr
27600 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
27610 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
27620 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
27630 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
27640 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
27650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
27660 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
27670 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
27680 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
27690 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
276a0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
276b0 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
276c0 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
276d0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
276e0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
276f0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
27700 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
27710 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
27720 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
27730 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
27740 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
27750 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
27760 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
27770 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
27780 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
27790 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
277a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
277b0 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
277c0 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
277d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
277e0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
277f0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
27800 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
27810 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
27820 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
27830 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
27840 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
27850 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
27860 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
27870 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
27880 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
27890 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
278a0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
278b0 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
278c0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
278d0 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
278e0 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
278f0 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
27900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
27910 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
27920 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
27930 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
27940 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
27950 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
27960 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
27970 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27980 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
27990 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
279a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
279b0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
279c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
279d0 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
279e0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
279f0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
27a00 20 6e 4c 65 61 66 20 3e 20 70 42 74 2d 3e 75 73   nLeaf > pBt->us
27a10 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
27a20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
27a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27a40 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
27a50 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
27a60 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70  .    if( nLeaf<p
27a70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
27a80 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
27a90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
27aa0 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
27ab0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
27ac0 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
27ad0 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
27ae0 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
27af0 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
27b00 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
27b10 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
27b20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
27b30 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
27b40 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
27b50 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
27b60 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
27b70 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
27b80 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
27b90 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
27ba0 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
27bb0 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
27bc0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
27bd0 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
27be0 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
27bf0 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
27c00 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
27c10 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
27c20 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
27c30 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
27c40 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
27c50 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
27c60 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
27c70 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
27c80 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
27c90 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
27ca0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
27cb0 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
27cc0 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
27cd0 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
27ce0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
27cf0 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
27d00 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
27d10 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
27d20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
27d30 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
27d40 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
27d50 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
27d60 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
27d70 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
27d80 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
27d90 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
27da0 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
27db0 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
27dc0 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
27dd0 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
27de0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
27df0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27e00 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
27e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27e30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
27e40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
27e50 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
27e60 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
27e70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
27e80 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
27e90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
27ea0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
27eb0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
27ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27ed0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
27ee0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
27ef0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
27f00 64 69 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d  dif.        rc =
27f10 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
27f20 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
27f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
27f40 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
27f50 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
27f60 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
27f70 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
27f80 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
27f90 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
27fa0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
27fb0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
27fc0 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
27fd0 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
27fe0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
27ff0 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
28000 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
28010 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
28020 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
28030 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
28040 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
28050 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
28060 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
28070 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
28080 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
28090 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
280a0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
280b0 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
280c0 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
280d0 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
280e0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
280f0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
28100 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
28110 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
28120 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
28130 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
28140 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
28150 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
28160 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
28170 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
28180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28190 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
281a0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
281b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
281c0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
281d0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
281e0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
281f0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
28200 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
28210 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
28220 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28230 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
28240 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
28250 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
28260 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
28270 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
28280 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
28290 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
282a0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
282b0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
282c0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
282d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
282e0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
282f0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
28300 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
28310 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
28320 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
28330 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
28340 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
28350 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
28360 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
28370 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
28380 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
28390 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
283a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
283b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
283c0 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
283d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
283e0 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
283f0 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
28400 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
28410 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28420 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
28430 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
28440 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
28450 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
28460 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50  vfl;.  u16 ovflP
28470 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
28480 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
28490 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
284a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
284b0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
284c0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
284d0 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
284e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
284f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28500 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
28510 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
28520 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
28530 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
28540 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
28550 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
28560 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
28570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
28580 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
28590 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
285a0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
285b0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
285c0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
285d0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
285e0 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
285f0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
28600 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
28610 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
28620 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
28630 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
28640 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
28650 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
28660 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
28670 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
28680 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63  lPgno>pagerPagec
28690 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
286a0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
286b0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
286c0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
286d0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
286e0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
286f0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
28700 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
28710 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
28720 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
28730 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
28740 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
28750 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
28760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28770 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
28780 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
28790 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
287a0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
287b0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
287c0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
287d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
287e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
287f0 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
28800 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
28810 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
28820 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
28830 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
28840 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
28850 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
28860 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
28870 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
28880 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
28890 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
288a0 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
288b0 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
288c0 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
288d0 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
288e0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
288f0 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
28900 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
28910 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
28920 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
28930 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
28940 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
28950 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
28960 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
28970 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
28980 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
28990 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
289a0 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
289b0 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
289c0 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
289d0 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
289e0 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
289f0 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
28a00 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
28a10 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
28a20 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
28a30 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
28a40 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
28a50 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
28a60 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
28a70 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
28a80 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
28a90 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
28aa0 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
28ab0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
28ac0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
28ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
28ae0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
28af0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
28b00 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
28b10 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
28b20 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
28b30 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
28b40 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
28b50 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
28b60 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
28b70 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
28b80 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
28b90 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
28ba0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
28bc0 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
28bd0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
28be0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
28bf0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
28c00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28c10 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
28c20 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
28c30 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
28c40 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
28c50 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
28c60 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
28c70 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
28c80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
28c90 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
28ca0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
28cb0 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
28cc0 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
28cd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
28ce0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
28cf0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
28d00 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
28d10 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
28d20 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
28d30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28d40 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28d50 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
28d60 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
28d70 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
28d80 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
28d90 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
28da0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
28db0 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
28dc0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
28dd0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
28de0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
28df0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
28e00 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
28e10 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
28e20 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
28e30 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
28e40 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
28e50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
28e60 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
28e70 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
28e80 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
28e90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
28ea0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
28eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
28ec0 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
28ed0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
28ee0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
28ef0 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
28f00 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
28f10 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
28f20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
28f30 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
28f40 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
28f50 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
28f60 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
28f70 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
28f80 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
28f90 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
28fa0 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
28fb0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
28fc0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
28fd0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
28fe0 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
28ff0 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
29000 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
29010 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
29020 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
29030 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
29040 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
29050 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
29060 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
29070 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
29080 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
29090 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
290a0 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
290b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
290c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
290d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
290e0 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
290f0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
29100 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
29110 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
29120 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
29130 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
29140 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
29150 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
29160 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
29170 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
29180 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
29190 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
291a0 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
291b0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
291c0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
291d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
291e0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
291f0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
29200 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
29210 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
29220 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
29230 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
29240 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
29250 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
29260 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
29270 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
29280 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
29290 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
292a0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
292b0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
292c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
292d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
292e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
292f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
29300 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
29310 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
29320 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
29330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
29340 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
29350 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
29360 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
29370 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
29380 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
29390 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
293a0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
293b0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
293c0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
293d0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
293e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
293f0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
29400 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
29410 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
29420 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
29430 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
29440 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
29450 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
29460 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
29470 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
29480 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
29490 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
294a0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
294b0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
294c0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
294d0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
294e0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
294f0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
29500 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
29510 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
29520 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
29530 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
29540 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
29550 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
29560 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
29570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29580 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
29590 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
295a0 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
295b0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
295c0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
295d0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
295e0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
295f0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
29600 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29610 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
29620 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
29630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29640 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
29650 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
29660 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
29670 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
29680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29690 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
296a0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
296b0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
296c0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
296d0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
296e0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
296f0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
29700 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
29710 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
29720 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
29730 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
29740 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
29750 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
29760 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
29770 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
29780 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
29790 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
297a0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
297b0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
297c0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
297d0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
297e0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
297f0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
29800 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
29810 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
29820 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
29830 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
29840 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
29850 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
29860 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
29870 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
29880 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
29890 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
298a0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
298b0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
298c0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
298d0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
298e0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
298f0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
29900 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
29910 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
29920 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
29930 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
29940 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
29950 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
29960 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
29970 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
29980 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
29990 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
299a0 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
299b0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
299c0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
299d0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
299e0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
299f0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
29a00 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
29a10 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
29a20 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
29a30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
29a40 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
29a50 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
29a60 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
29a70 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
29a80 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
29a90 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
29aa0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
29ab0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
29ac0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
29ad0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
29ae0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
29af0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
29b00 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
29b10 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
29b20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29b30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
29b40 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
29b50 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
29b60 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
29b70 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
29b80 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
29b90 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
29ba0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
29bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
29bc0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
29bd0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
29be0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
29bf0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
29c00 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
29c10 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
29c20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
29c30 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
29c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
29c50 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
29c60 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
29c70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
29c80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
29c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29ca0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29cb0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
29cc0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
29cd0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
29ce0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
29cf0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
29d00 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
29d10 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
29d20 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
29d30 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
29d40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
29d50 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
29d60 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
29d70 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
29d80 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
29d90 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
29da0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
29db0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
29dc0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
29dd0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
29de0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
29df0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
29e00 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
29e10 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
29e20 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pRC){.  int i;
29e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29e40 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
29e50 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  nt pc;         /
29e60 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
29e70 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
29e80 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
29e90 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
29ea0 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
29eb0 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
29ec0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
29ed0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
29ee0 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
29ef0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
29f00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29f10 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
29f20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
29f30 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
29f40 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
29f50 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
29f60 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
29f70 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
29f80 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
29f90 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
29fa0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
29fb0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
29fc0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
29fd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29fe0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29ff0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a000 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a010 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a020 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2a030 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2a040 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2a050 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61   ptr = &data[pPa
2a060 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2a070 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20   2*idx];.  pc = 
2a080 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2a090 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2a0a0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2a0b0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2a0c0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2a0d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2a0e0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2a0f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2a100 20 20 69 66 28 20 70 63 20 3c 20 67 65 74 32 62    if( pc < get2b
2a110 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2a120 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
2a130 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a140 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
2a150 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a160 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
2a170 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
2a180 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
2a190 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
2a1a0 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
2a1b0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
2a1c0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
2a1d0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
2a1e0 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
2a1f0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2a200 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
2a210 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
2a220 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2a230 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a240 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2a250 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2a260 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2a270 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2a280 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2a290 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2a2a0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2a2b0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2a2c0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2a2d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2a2e0 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2a2f0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2a300 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2a310 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2a320 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2a330 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2a340 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2a350 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2a360 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2a370 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2a380 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2a390 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2a3a0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2a3b0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2a3c0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2a3d0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2a3e0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2a3f0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2a400 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2a410 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2a420 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2a430 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2a440 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2a450 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2a460 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2a470 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2a480 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2a490 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2a4a0 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2a4b0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2a4c0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2a4d0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2a4e0 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2a4f0 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2a500 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2a510 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2a520 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2a530 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2a540 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2a550 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2a560 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2a570 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2a580 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2a590 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2a5a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2a5b0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2a5c0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2a5d0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2a5e0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2a5f0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2a600 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2a610 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2a620 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2a630 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2a640 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2a650 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2a660 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2a670 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2a680 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2a690 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2a6a0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2a6b0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2a6c0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2a6d0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2a6e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2a6f0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2a700 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2a710 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2a720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2a730 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2a740 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2a750 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
2a760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
2a770 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2a780 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2a790 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2a7a0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2a7b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a7c0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2a7d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2a7e0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2a7f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2a800 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2a810 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2a820 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2a830 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2a840 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2a850 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2a860 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2a870 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2a880 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2a890 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2a8a0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2a8b0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2a8c0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2a8d0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2a8e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2a8f0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2a900 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2a910 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74 20  ata[] */..  int 
2a920 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2a930 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2a940 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2a950 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2a960 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2a970 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2a980 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2a990 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2a9a0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2a9b0 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2a9c0 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
2a9d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2a9e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2a9f0 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2aa00 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  aOvfl) );.  asse
2aa10 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2aa20 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2aa30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2aa40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aa50 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2aa60 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
2aa70 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
2aa80 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
2aa90 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
2aaa0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
2aab0 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
2aac0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2aad0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
2aae0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
2aaf0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
2ab00 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2ab10 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
2ab20 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2ab30 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
2ab40 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
2ab50 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
2ab60 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
2ab70 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2ab80 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
2ab90 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
2aba0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
2abb0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2abc0 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69  [j].idx = (u16)i
2abd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2abe0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2abf0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2ac00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2ac10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ac20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2ac30 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2ac40 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2ac50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ac60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ac70 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ac80 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2ac90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2aca0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2acb0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2acc0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2acd0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ace0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2acf0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
2ad00 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2ad10 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
2ad20 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
2ad30 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
2ad40 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
2ad50 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
2ad60 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
2ad70 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
2ad80 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
2ad90 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
2ada0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
2adb0 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
2adc0 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
2add0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2ade0 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67 65 2d 3e  dx+sz <= pPage->
2adf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2ae00 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2ae10 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2ae20 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2ae30 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2ae40 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2ae50 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2ae60 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2ae70 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2ae80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2ae90 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2aea0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ld);.    }.    f
2aeb0 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72 3d 26 64  or(j=end, ptr=&d
2aec0 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a  ata[j]; j>ins; j
2aed0 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20  -=2, ptr-=2){.  
2aee0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
2aef0 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b  [-2];.      ptr[
2af00 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20  1] = ptr[-1];.  
2af10 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2af20 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2af30 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2af40 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2af50 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2af60 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2af70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2af80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2af90 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2afa0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2afb0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2afc0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2afd0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2afe0 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2aff0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2b000 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2b010 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2b020 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2b030 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2b040 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2b050 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2b060 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2b070 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2b080 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2b090 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2b0a0 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2b0b0 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2b0c0 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2b0d0 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2b0e0 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2b0f0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2b100 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2b110 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2b120 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2b130 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2b140 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2b150 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2b160 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2b170 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2b180 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2b190 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2b1a0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2b1b0 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2b1c0 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2b1d0 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2b1e0 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2b1f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2b200 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b210 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2b220 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2b230 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2b240 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2b250 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2b260 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2b270 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2b280 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2b290 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2b2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b2b0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2b2c0 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2b2d0 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2b2e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2b2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b300 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2b310 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2b320 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2b330 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b340 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2b350 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2b360 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2b370 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2b380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b390 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b3a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2b3b0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2b3c0 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2b3d0 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2b3e0 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
2b3f0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
2b400 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  460 );.  assert(
2b410 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b420 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2b430 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2b440 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2b450 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2b460 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2b470 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2b480 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b490 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2b4a0 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
2b4b0 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
2b4c0 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
2b4d0 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
2b4e0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43  >cellOffset + nC
2b4f0 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
2b500 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
2b510 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
2b520 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  >=0; i--){.    p
2b530 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
2b540 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53    cellbody -= aS
2b550 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32  ize[i];.    put2
2b560 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2b570 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2b580 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2b590 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2b5a0 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a   aSize[i]);.  }.
2b5b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2b5c0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
2b5d0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2b5e0 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
2b5f0 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
2b600 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
2b610 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
2b620 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
2b630 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
2b640 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
2b650 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
2b660 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
2b670 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
2b680 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
2b690 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
2b6a0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2b6b0 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
2b6c0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2b6d0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
2b6e0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
2b6f0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
2b700 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2b710 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
2b720 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
2b730 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2b740 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2b750 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
2b760 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
2b770 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
2b780 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
2b790 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
2b7a0 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
2b7b0 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
2b7c0 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
2b7d0 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
2b7e0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
2b7f0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
2b800 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
2b810 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
2b820 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
2b830 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
2b840 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
2b850 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
2b860 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
2b870 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
2b880 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
2b890 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
2b8a0 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
2b8b0 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
2b8c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b8d0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
2b8e0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
2b8f0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
2b900 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
2b910 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
2b920 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
2b930 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
2b940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b950 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
2b960 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
2b970 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
2b980 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
2b990 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
2b9a0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
2b9b0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
2b9c0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
2b9d0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
2b9e0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
2b9f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
2ba00 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
2ba10 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
2ba20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
2ba30 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2ba40 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
2ba50 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
2ba60 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
2ba70 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
2ba80 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
2ba90 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
2baa0 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
2bab0 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
2bac0 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
2bad0 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
2bae0 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
2baf0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
2bb00 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
2bb10 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
2bb20 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
2bb30 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
2bb40 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
2bb50 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
2bb60 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
2bb70 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
2bb80 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
2bb90 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
2bba0 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
2bbb0 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
2bbc0 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
2bbd0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
2bbe0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
2bbf0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
2bc00 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
2bc10 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
2bc20 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
2bc30 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
2bc40 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
2bc50 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
2bc60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
2bc70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
2bc80 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
2bc90 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
2bca0 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
2bcb0 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
2bcc0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2bcd0 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
2bce0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
2bcf0 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
2bd00 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
2bd10 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
2bd20 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
2bd30 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
2bd40 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
2bd50 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
2bd60 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
2bd70 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
2bd80 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
2bd90 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
2bda0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
2bdb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2bdc0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
2bdd0 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
2bde0 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
2bdf0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2be00 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
2be10 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
2be20 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be40 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
2be50 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2be60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2be90 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
2bea0 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bec0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2bed0 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
2bee0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2bef0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2bf00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2bf10 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2bf20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2bf30 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
2bf40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2bf50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
2bf60 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
2bf70 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74  ->nCell<=0 ) ret
2bf80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2bf90 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2bfa0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2bfb0 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2bfc0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2bfd0 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2bfe0 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2bff0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c000 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2c010 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2c020 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2c030 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2c040 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2c050 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2c060 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2c070 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2c080 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2c090 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2c0a0 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2c0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c0c0 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2c0d0 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2c0e0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2c0f0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
2c100 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a  Cell;.    u16 sz
2c110 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2c120 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2c130 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2c140 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2c150 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c160 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2c170 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2c180 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2c190 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2c1a0 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2c1b0 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2c1c0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2c1d0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2c1e0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2c1f0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2c200 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2c210 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2c220 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2c230 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2c240 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2c250 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2c260 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2c270 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2c280 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2c290 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2c2a0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2c2b0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2c2c0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2c2d0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2c2e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2c2f0 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2c300 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2c310 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2c320 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2c330 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2c340 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2c350 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2c360 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2c370 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2c380 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2c390 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2c3a0 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2c3b0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2c3c0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2c3d0 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2c3e0 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2c3f0 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2c400 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2c410 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2c420 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2c430 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c440 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2c450 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2c460 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2c470 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2c480 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2c490 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2c4a0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2c4b0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2c4c0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2c4d0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2c4e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2c4f0 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2c500 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2c510 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2c520 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2c530 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2c540 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2c550 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2c560 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2c570 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2c580 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2c590 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2c5a0 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2c5b0 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2c5c0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2c5d0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2c5e0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2c5f0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2c600 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2c610 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2c620 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2c630 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2c640 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2c650 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2c660 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2c670 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2c680 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2c690 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2c6a0 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2c6b0 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2c6c0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2c6d0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2c6e0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2c6f0 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2c700 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2c710 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2c720 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2c730 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2c740 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2c750 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2c760 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2c770 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2c780 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2c790 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2c7a0 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2c7b0 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2c7c0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2c7d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c7e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2c7f0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2c800 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2c810 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2c820 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2c830 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2c840 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2c850 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2c860 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2c870 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2c880 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2c890 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2c8a0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2c8b0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2c8c0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2c8d0 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2c8e0 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2c8f0 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2c900 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2c910 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2c920 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2c930 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2c940 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2c950 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2c960 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2c970 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2c980 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2c990 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2c9a0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2c9b0 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2c9c0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2c9d0 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2c9e0 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2c9f0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2ca00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2ca10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2ca20 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2ca30 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2ca40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ca50 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2ca60 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2ca70 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2ca80 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2ca90 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2caa0 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2cab0 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2cac0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2cad0 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2cae0 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2caf0 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2cb00 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2cb10 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2cb20 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2cb30 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2cb40 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2cb50 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2cb60 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2cb70 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2cb80 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2cb90 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
2cba0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2cbb0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
2cbc0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2cbd0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
2cbe0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
2cbf0 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
2cc00 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2cc10 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
2cc20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
2cc30 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
2cc40 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2cc50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
2cc60 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
2cc70 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2cc80 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
2cc90 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
2cca0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2ccb0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2ccc0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
2ccd0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2cce0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2ccf0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2cd00 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
2cd10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cd20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2cd30 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2cd40 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2cd50 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
2cd60 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2cd70 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2cd80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2cd90 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2cda0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2cdb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2cdc0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cdd0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
2cde0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2cdf0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ce00 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ce10 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
2ce20 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2ce30 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2ce40 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2ce50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2ce60 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2ce70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ce80 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
2ce90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2cea0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
2ceb0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2cec0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
2ced0 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
2cee0 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
2cef0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
2cf00 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
2cf10 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
2cf20 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
2cf30 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
2cf40 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
2cf50 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
2cf60 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
2cf70 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
2cf80 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
2cf90 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
2cfa0 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
2cfb0 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
2cfc0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
2cfd0 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
2cfe0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2cff0 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
2d000 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
2d010 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
2d020 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
2d030 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
2d040 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
2d050 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
2d060 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
2d070 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
2d080 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
2d090 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79  ge.aOvfl[] array
2d0a0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
2d0b0 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
2d0c0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
2d0d0 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
2d0e0 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
2d0f0 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
2d100 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
2d110 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
2d120 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2d130 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
2d140 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
2d150 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
2d160 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
2d170 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
2d180 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
2d190 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
2d1a0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
2d1b0 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
2d1c0 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
2d1d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d1e0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2d1f0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2d200 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
2d210 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2d220 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2d230 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
2d240 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
2d250 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
2d260 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
2d270 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
2d280 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
2d290 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
2d2a0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
2d2b0 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
2d2c0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
2d2d0 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
2d2e0 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
2d2f0 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
2d300 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 69 6e 74      TESTONLY(int
2d310 20 72 63 3b 29 0a 20 20 20 20 69 6e 74 20 69 44   rc;).    int iD
2d320 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61  ata;.  .  .    a
2d330 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
2d340 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65  Init );.    asse
2d350 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65  rt( pFrom->nFree
2d360 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20  >=iToHdr );.    
2d370 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
2d380 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2d390 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c  +5])<=pBt->usabl
2d3a0 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
2d3b0 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
2d3c0 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
2d3d0 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
2d3e0 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
2d3f0 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
2d400 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2d410 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
2d420 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
2d430 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
2d440 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2d450 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
2d460 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
2d470 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
2d480 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
2d490 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
2d4a0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
2d4b0 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
2d4c0 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
2d4d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2d4e0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
2d4f0 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
2d500 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
2d510 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
2d520 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63 61 6e  tion of pTo "can
2d530 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20 74 68  not" fail, as th
2d540 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 63 6f  e.    ** data co
2d550 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20  pied from pFrom 
2d560 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  is known to be v
2d570 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 20 20 70 54  alid.  */.    pT
2d580 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2d590 20 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d     TESTONLY(rc =
2d5a0 20 29 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   ) btreeInitPage
2d5b0 28 70 54 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  (pTo);.    asser
2d5c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2d5d0 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66   );.  .    /* If
2d5e0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2d5f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2d600 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2d610 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2d620 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
2d630 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
2d640 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
2d650 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
2d660 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
2d670 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2d680 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2d690 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
2d6a0 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
2d6b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2d6c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d6d0 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
2d6e0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
2d6f0 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
2d700 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
2d710 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
2d720 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
2d730 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
2d740 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
2d750 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
2d760 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
2d770 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
2d780 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
2d790 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
2d7a0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
2d7b0 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
2d7c0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
2d7d0 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
2d7e0 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
2d7f0 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
2d800 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
2d810 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
2d820 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
2d830 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
2d840 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
2d850 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
2d860 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
2d870 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
2d880 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
2d890 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
2d8a0 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
2d8b0 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
2d8c0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
2d8d0 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
2d8e0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
2d8f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
2d900 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
2d910 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
2d920 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
2d930 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
2d940 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
2d950 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
2d960 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
2d970 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
2d980 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
2d990 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
2d9a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2d9b0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
2d9c0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
2d9d0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
2d9e0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
2d9f0 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
2da00 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
2da10 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
2da20 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
2da30 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
2da40 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
2da50 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
2da60 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
2da70 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2da80 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
2da90 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
2daa0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
2dab0 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
2dac0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
2dad0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
2dae0 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
2daf0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
2db00 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
2db10 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
2db20 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
2db30 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
2db40 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
2db50 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
2db60 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
2db70 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
2db80 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
2db90 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
2dba0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
2dbb0 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
2dbc0 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
2dbd0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
2dbe0 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
2dbf0 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
2dc00 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
2dc10 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
2dc20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
2dc30 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
2dc40 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
2dc50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
2dc60 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
2dc70 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
2dc80 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
2dc90 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
2dca0 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
2dcb0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
2dcc0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2dcd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
2dce0 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
2dcf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2dd00 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
2dd10 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
2dd20 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
2dd30 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
2dd40 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
2dd50 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
2dd60 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
2dd70 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
2dd80 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
2dd90 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
2dda0 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
2ddb0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
2ddc0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2ddd0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
2dde0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
2ddf0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
2de00 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
2de10 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
2de20 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
2de30 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
2de40 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
2de50 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
2de60 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
2de70 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
2de80 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
2de90 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
2dea0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
2deb0 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
2dec0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
2ded0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
2dee0 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
2def0 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
2df00 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
2df10 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
2df20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
2df30 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2df40 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65  ce_nonroot(.  Me
2df50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2df70 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20   Parent page of 
2df80 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62  siblings being b
2df90 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  alanced */.  int
2dfa0 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20   iParentIdx,    
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dfc0 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61  Index of "the pa
2dfd0 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  ge" in pParent *
2dfe0 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61  /.  u8 *aOvflSpa
2dff0 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
2e000 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65      /* page-size
2e010 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2e020 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20  for parent ovfl 
2e030 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 20  */.  int isRoot 
2e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e050 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2e060 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f  pParent is a roo
2e070 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42  t-page */.){.  B
2e080 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2e090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2e0a0 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
2e0b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
2e0c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e0d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2e0e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2e0f0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
2e100 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
2e110 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
2e120 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
2e130 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
2e140 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
2e150 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e160 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e170 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
2e180 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e1b0 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
2e1c0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
2e1d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
2e1e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2e1f0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
2e200 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
2e210 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
2e220 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
2e230 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
2e240 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2e250 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e260 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2e270 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
2e280 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
2e290 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
2e2a0 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2e2b0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
2e2c0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
2e2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2e2e0 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
2e2f0 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
2e300 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
2e310 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
2e320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2e330 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
2e340 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
2e350 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
2e360 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2e370 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
2e380 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
2e390 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e3b0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
2e3c0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
2e3d0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
2e3e0 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
2e3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e400 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
2e410 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
2e420 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
2e430 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
2e440 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2e450 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
2e460 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
2e470 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
2e480 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2e490 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2e4a0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
2e4b0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
2e4c0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
2e4d0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
2e4e0 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
2e4f0 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
2e500 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
2e510 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
2e520 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
2e530 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2e540 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
2e550 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2e560 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
2e570 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
2e580 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
2e590 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e5a0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
2e5b0 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
2e5c0 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
2e5d0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
2e5e0 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
2e5f0 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
2e600 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
2e610 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
2e620 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2e630 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
2e640 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
2e650 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
2e660 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
2e670 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
2e680 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
2e690 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
2e6a0 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
2e6b0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
2e6c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e6d0 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
2e6e0 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
2e6f0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e710 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
2e720 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
2e730 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
2e740 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
2e750 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
2e760 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
2e770 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
2e780 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e7a0 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
2e7b0 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
2e7c0 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
2e7d0 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
2e7e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e7f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2e800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2e810 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e820 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e830 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2e840 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
2e850 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
2e860 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
2e870 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
2e880 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
2e890 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
2e8a0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2e8b0 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
2e8c0 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
2e8d0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
2e8e0 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
2e8f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
2e900 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
2e910 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
2e920 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
2e930 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
2e940 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
2e950 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
2e960 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
2e970 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
2e980 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
2e990 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
2e9a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2e9b0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2e9c0 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2e9d0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2e9e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2e9f0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2ea00 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2ea10 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2ea20 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2ea30 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2ea40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ea50 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2ea60 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2ea70 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2ea80 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2ea90 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2eaa0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2eab0 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2eac0 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2ead0 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2eae0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2eaf0 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2eb00 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2eb10 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2eb20 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2eb30 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2eb40 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2eb50 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2eb60 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2eb70 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2eb80 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2eb90 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2eba0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2ebb0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2ebc0 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2ebd0 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2ebe0 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2ebf0 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2ec00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2ec10 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2ec20 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2ec30 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2ec40 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2ec50 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2ec60 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2ec70 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2ec80 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61  page, since if a
2ec90 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20  ny existed they 
2eca0 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61  will.  ** have a
2ecb0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f  lready been remo
2ecc0 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20  ved..  */.  i = 
2ecd0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ece0 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ow + pParent->nC
2ecf0 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29  ell;.  if( i<2 )
2ed00 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
2ed10 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b  .    nOld = i+1;
2ed20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f  .  }else{.    nO
2ed30 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69 66 28 20  ld = 3;.    if( 
2ed40 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed60 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
2ed70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2ed80 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
2ed90 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
2eda0 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i-2;.    }else{.
2edb0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
2edc0 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
2edd0 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d  }.    i = 2;.  }
2ede0 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
2edf0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2ee00 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
2ee10 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
2ee20 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
2ee30 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2ee40 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
2ee50 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
2ee60 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
2ee70 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2ee80 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
2ee90 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
2eea0 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
2eeb0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
2eec0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
2eed0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
2eee0 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
2eef0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2ef00 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
2ef10 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
2ef20 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2ef30 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2ef40 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2ef50 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2ef60 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2ef70 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2ef80 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2ef90 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2efa0 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
2efb0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2efc0 5d 2e 69 64 78 20 26 26 20 70 50 61 72 65 6e 74  ].idx && pParent
2efd0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2efe0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2eff0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2f000 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2f010 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2f020 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2f030 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2f040 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2f050 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2f060 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2f070 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2f080 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2f090 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2f0a0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2f0b0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f0c0 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2f0d0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2f0e0 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2f0f0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2f100 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2f110 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2f120 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2f130 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2f140 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2f150 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2f160 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2f170 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2f180 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2f190 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2f1a0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2f1b0 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2f1c0 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2f1d0 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2f1e0 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2f1f0 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2f200 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2f210 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2f220 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2f230 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2f240 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2f250 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2f260 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2f270 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2f280 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2f290 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2f2a0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2f2b0 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2f2c0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2f2d0 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2f2e0 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2f2f0 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2f300 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2f310 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2f320 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2f330 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2f340 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2f350 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2f360 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2f370 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2f380 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2f390 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2f3a0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2f3b0 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2f3c0 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2f3d0 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2f3e0 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2f3f0 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2f400 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2f410 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2f420 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2f430 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2f440 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2f450 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2f460 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2f470 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2f480 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2f490 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2f4a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2f4b0 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ew[i], &rc);.   
2f4c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
2f4d0 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2f4e0 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2f4f0 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2f500 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2f510 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2f520 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2f530 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2f540 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2f550 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2f560 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2f570 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
2f580 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
2f590 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2f5a0 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
2f5b0 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
2f5c0 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5e0 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
2f5f0 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
2f600 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f620 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
2f630 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2f640 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2f650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f660 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2f670 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6a0 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
2f6b0 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
2f6c0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
2f6d0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
2f6e0 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
2f6f0 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
2f700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2f710 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
2f720 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2f730 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
2f740 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
2f750 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
2f760 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
2f770 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
2f780 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2f790 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
2f7a0 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
2f7b0 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
2f7c0 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
2f7d0 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
2f7e0 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
2f7f0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2f800 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
2f810 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
2f820 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
2f830 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2f840 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
2f850 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
2f860 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
2f870 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
2f880 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
2f890 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
2f8a0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2f8b0 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
2f8c0 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
2f8d0 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
2f8e0 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
2f8f0 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
2f900 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
2f910 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
2f920 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
2f930 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
2f940 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
2f950 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2f960 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
2f970 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
2f980 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
2f990 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
2f9a0 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
2f9b0 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
2f9c0 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
2f9d0 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
2f9e0 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2f9f0 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
2fa00 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
2fa10 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
2fa20 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
2fa30 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2fa40 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
2fa50 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
2fa60 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
2fa70 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
2fa80 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
2fa90 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
2faa0 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
2fab0 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
2fac0 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
2fad0 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
2fae0 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
2faf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
2fb00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
2fb10 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
2fb20 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
2fb30 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
2fb40 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2fb50 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
2fb60 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
2fb70 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2fb80 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2fb90 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2fba0 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
2fbb0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
2fbc0 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
2fbd0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
2fbe0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
2fbf0 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
2fc00 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
2fc10 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
2fc20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
2fc30 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
2fc40 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
2fc50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2fc60 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
2fc70 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
2fc80 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
2fc90 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
2fca0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
2fcb0 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
2fcc0 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
2fcd0 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2fce0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
2fcf0 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
2fd00 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
2fd10 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
2fd20 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
2fd30 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2fd40 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2fd50 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
2fd60 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
2fd70 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
2fd80 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
2fd90 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
2fda0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
2fdb0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
2fdc0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2fdd0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
2fde0 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
2fdf0 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
2fe00 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
2fe10 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
2fe20 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
2fe30 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
2fe40 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2fe50 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
2fe60 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2fe70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
2fe80 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
2fe90 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2fea0 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2feb0 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2fec0 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
2fed0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2fee0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
2fef0 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
2ff00 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c  z);.      apCell
2ff10 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
2ff20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2ff30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2ff40 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2ff50 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2ff60 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a  n==4 );.      sz
2ff70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2ff80 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65  Cell[nCell] - le
2ff90 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2ffa0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
2ffb0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  eaf ){.        a
2ffc0 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2ffd0 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
2ffe0 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
2fff0 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
30000 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
30010 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
30020 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
30030 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
30040 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  e left.        *
30050 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
30060 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
30070 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
30080 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
30090 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pOld->aData[8], 
300a0 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
300b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
300c0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
300d0 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =4 );.        if
300e0 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
300f0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
30100 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
30110 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
30120 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
30130 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  /.          szCe
30140 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
30150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30160 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
30170 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
30180 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
30190 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
301a0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
301b0 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
301c0 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
301d0 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
301e0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
301f0 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
30200 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
30210 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
30220 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
30230 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
30240 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
30250 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
30260 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
30270 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
30280 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
30290 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
302a0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
302b0 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
302c0 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
302d0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
302e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
302f0 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
30300 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
30310 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
30320 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
30330 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
30340 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
30350 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
30360 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
30370 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
30380 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
30390 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
303a0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
303b0 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
303c0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
303d0 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
303e0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
303f0 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
30400 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
30410 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
30420 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
30430 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
30440 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
30450 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
30460 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
30470 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
30480 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
30490 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
304a0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
304b0 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
304c0 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
304d0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
304e0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
304f0 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
30500 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
30510 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
30520 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
30530 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
30540 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
30550 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b  .      if( k>NB+
30560 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  1 ){ rc = SQLITE
30570 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62  _CORRUPT; goto b
30580 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
30590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
305a0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
305b0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
305c0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
305d0 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
305e0 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
305f0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
30600 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
30610 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
30620 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
30630 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
30640 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
30650 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
30660 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
30670 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
30680 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
30690 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
306a0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
306b0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
306c0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
306d0 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
306e0 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
306f0 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
30700 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
30710 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
30720 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
30730 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
30740 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
30750 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
30760 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
30770 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
30780 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
30790 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
307a0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
307b0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
307c0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
307d0 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
307e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
307f0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
30800 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
30810 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
30820 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
30830 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
30840 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
30850 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
30860 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
30870 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
30880 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
30890 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
308a0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
308b0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
308c0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
308d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
308e0 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
308f0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
30900 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
30910 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
30920 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
30930 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
30940 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
30950 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
30960 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
30970 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
30980 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
30990 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
309a0 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
309b0 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
309c0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
309d0 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
309e0 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
309f0 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
30a00 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
30a10 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
30a20 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
30a30 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
30a40 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
30a50 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
30a60 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
30a70 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
30a80 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
30a90 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
30aa0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
30ab0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
30ac0 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
30ad0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
30ae0 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
30af0 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
30b00 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
30b10 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
30b20 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
30b30 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
30b40 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
30b50 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
30b60 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
30b70 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
30b80 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
30b90 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
30ba0 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
30bb0 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
30bc0 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
30bd0 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
30be0 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
30bf0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
30c00 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
30c10 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
30c20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
30c30 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
30c40 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
30c50 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
30c60 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
30c70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
30c80 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
30c90 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
30ca0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
30cb0 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
30cc0 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
30cd0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
30ce0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
30cf0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
30d00 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
30d10 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
30d20 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
30d30 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
30d40 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
30d50 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30d60 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
30d70 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
30d80 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
30d90 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
30da0 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
30db0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
30dc0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
30dd0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
30de0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
30df0 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  no, pgno, 0);.  
30e00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30e10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
30e20 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
30e30 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
30e40 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
30e50 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
30e60 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
30e70 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
30e80 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
30e90 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
30ea0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
30eb0 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
30ec0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
30ed0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
30ee0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
30ef0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30f00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30f10 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30f20 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
30f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
30f40 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
30f50 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
30f60 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
30f70 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
30f80 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
30f90 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
30fa0 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
30fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30fc0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30fd0 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
30fe0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
30ff0 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
31000 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
31010 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
31020 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
31030 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
31040 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
31050 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
31060 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
31070 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
31080 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
31090 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
310a0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
310b0 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
310c0 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
310d0 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
310e0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
310f0 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
31100 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
31110 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
31120 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
31130 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
31140 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
31150 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
31160 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
31170 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
31180 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
31190 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
311a0 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
311b0 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
311c0 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
311d0 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
311e0 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
311f0 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
31200 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
31210 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
31220 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
31230 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
31240 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
31250 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
31260 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
31270 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
31280 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
31290 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
312a0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
312b0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
312c0 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
312d0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
312e0 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
312f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31300 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
31310 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
31320 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
31330 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77  .      t = apNew
31340 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [i]->pgno;.     
31350 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
31360 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
31370 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
31380 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
31390 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
313a0 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
313b0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
313c0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
313d0 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
313e0 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
313f0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
31400 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
31410 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
31420 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
31430 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
31440 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
31450 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
31460 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
31470 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
31480 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
31490 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
314a0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
314b0 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
314c0 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
314d0 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
314e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
314f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31500 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
31510 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
31520 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
31530 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
31540 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
31550 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
31560 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
31570 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
31580 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
31590 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
315a0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
315b0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
315c0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
315d0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
315e0 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
315f0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
31600 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
31610 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
31620 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
31630 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
31640 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
31650 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
31660 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
31670 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
31680 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
31690 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
316a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
316b0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
316c0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
316d0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
316e0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
316f0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
31700 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
31710 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
31720 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
31730 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
31740 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
31750 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
31760 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
31770 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
31780 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
31790 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
317a0 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
317b0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
317c0 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
317d0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
317e0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
317f0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
31800 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
31810 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
31820 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
31830 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
31840 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
31850 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
31860 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
31870 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
31880 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
31890 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
318a0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
318b0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
318c0 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
318d0 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
318e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
318f0 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
31900 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
31910 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
31920 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
31930 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
31940 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
31950 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
31960 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
31970 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
31980 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
31990 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
319a0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
319b0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
319c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
319d0 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
319e0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
319f0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
31a00 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
31a10 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
31a20 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
31a30 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
31a40 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
31a50 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
31a60 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
31a70 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
31a80 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
31a90 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
31aa0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
31ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31ac0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
31ad0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
31ae0 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
31af0 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
31b00 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
31b10 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
31b20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
31b30 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
31b40 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
31b50 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
31b60 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
31b70 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
31b80 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
31b90 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
31ba0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
31bb0 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e btreeParseCell
31bc0 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
31bd0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
31be0 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
31bf0 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
31c00 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
31c10 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
31c20 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
31c30 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
31c40 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
31c50 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
31c60 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
31c70 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
31c80 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
31c90 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
31ca0 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
31cb0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
31cc0 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
31cd0 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
31ce0 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
31cf0 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
31d00 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
31d10 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
31d20 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
31d30 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
31d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
31d50 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
31d60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
31d70 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
31d80 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
31d90 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
31da0 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
31db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31dc0 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70   }.      iOvflSp
31dd0 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
31de0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
31df0 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
31e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
31e10 76 66 6c 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70  vflSpace<=pBt->p
31e20 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
31e30 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
31e40 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
31e50 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
31e60 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
31e70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31e80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
31e90 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
31eb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31ec0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
31ed0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
31ee0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
31ef0 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
31f00 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
31f10 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
31f20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
31f30 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
31f40 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
31f50 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
31f60 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
31f70 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
31f80 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
31f90 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
31fa0 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
31fb0 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
31fc0 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20  }..  if( isRoot 
31fd0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
31fe0 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  l==0 && pParent-
31ff0 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65  >hdrOffset<=apNe
32000 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  w[0]->nFree ){. 
32010 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
32020 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
32030 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e  e now contains n
32040 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c  o cells. The onl
32050 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  y sibling.    **
32060 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67   page is the rig
32070 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
32080 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65  parent. Copy the
32090 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
320a0 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61  .    ** child pa
320b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ge into the pare
320c0 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74  nt, decreasing t
320d0 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68  he overall heigh
320e0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
320f0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
32100 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73   by one. This is
32110 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68   described as th
32120 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c  e "balance-shall
32130 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62  ower".    ** sub
32140 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f  -algorithm in so
32150 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  me documentation
32160 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32170 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
32180 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
32190 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  se, the call to 
321a0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
321b0 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61  ) .    ** sets a
321c0 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
321d0 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
321e0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
321f0 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20   image pages .  
32200 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74    ** for which t
32210 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74  he pointer is st
32220 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
32230 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f  content being co
32240 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  pied..    **.   
32250 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61   ** The second a
32260 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69  ssert below veri
32270 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68  fies that the ch
32280 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72  ild page is defr
32290 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20  agmented.    ** 
322a0 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20  (it must be, as 
322b0 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f  it was just reco
322c0 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20  nstructed using 
322d0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e  assemblePage()).
322e0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
322f0 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65  important if the
32300 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70   parent page hap
32310 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20  pens to be page 
32320 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
32330 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20  e.    ** image. 
32340 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
32350 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61  nNew==1 );.    a
32360 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d  ssert( apNew[0]-
32370 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20  >nFree == .     
32380 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70     (get2byte(&ap
32390 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d  New[0]->aData[5]
323a0 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c  )-apNew[0]->cell
323b0 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d  Offset-apNew[0]-
323c0 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29  >nCell*2) .    )
323d0 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
323e0 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
323f0 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20  pParent, &rc);. 
32400 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65     freePage(apNe
32410 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65  w[0], &rc);.  }e
32420 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41  lse if( ISAUTOVA
32430 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46  CUUM ){.    /* F
32440 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ix the pointer-m
32450 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
32460 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61  ll the cells tha
32470 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61  t were shifted a
32480 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54  round. .    ** T
32490 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
324a0 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
324b0 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
324c0 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65  entries that nee
324d0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64  d to.    ** be d
324e0 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69  ealt with by thi
324f0 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20  s routine. Some 
32500 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65  of these have be
32510 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20  en set already, 
32520 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20  but.    ** many 
32530 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f  have not. The fo
32540 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d  llowing is a sum
32550 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mary:.    **.   
32560 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74   **   1) The ent
32570 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
32580 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67  with new sibling
32590 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
325a0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20   not.    **     
325b0 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74   siblings when t
325c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
325d0 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68   called. These h
325e0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ave already.    
325f0 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74  **      been set
32600 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20  . We don't need 
32610 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f  to worry about o
32620 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  ld siblings that
32630 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   were.    **    
32640 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66    moved to the f
32650 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66  ree-list - the f
32660 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68  reePage() code h
32670 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20  as taken care.  
32680 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f    **      of tho
32690 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
326a0 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74  *   2) The point
326b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er-map entries a
326c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
326d0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
326e0 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61  w.    **      pa
326f0 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c  ge in any overfl
32700 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62  ow chains used b
32710 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  y new divider ce
32720 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20  lls. These .    
32730 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73  **      have als
32740 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  o already been t
32750 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20  aken care of by 
32760 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
32770 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
32780 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65    **   3) If the
32790 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
327a0 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
327b0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61  hen the child pa
327c0 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20  ges of.    **   
327d0 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20     cells stored 
327e0 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  on the sibling p
327f0 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ages may need to
32800 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
32810 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20   **.    **   4) 
32820 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
32830 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74  ages are not int
32840 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
32850 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20  es, then any.   
32860 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f   **      overflo
32870 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20  w pages used by 
32880 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20  these cells may 
32890 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
328a0 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28  ed.    **      (
328b0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
328c0 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  nodes never cont
328d0 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ain pointers to 
328e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
328f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
32900 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   5) If the sibli
32910 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
32920 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
32930 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
32940 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65    **      entrie
32950 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
32960 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65  child pages of e
32970 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20  ach sibling may 
32980 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  need.    **     
32990 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
329a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61      **.    ** Ca
329b0 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20  ses 1 and 2 are 
329c0 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65  dealt with above
329d0 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20   by other code. 
329e0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
329f0 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
32a00 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61   cases 3 and 4 a
32a10 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72  nd the one after
32a20 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53   that, case 5. S
32a30 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74  ince.    ** sett
32a40 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61  ing a pointer ma
32a50 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c  p entry is a rel
32a60 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76  atively expensiv
32a70 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  e operation, thi
32a80 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e  s.    ** code on
32a90 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20  ly sets pointer 
32aa0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
32ab0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
32ac0 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  w pages that hav
32ad0 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  e.    ** actuall
32ae0 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20  y moved between 
32af0 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d  pages.  */.    M
32b00 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
32b10 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d  pNew[0];.    Mem
32b20 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
32b30 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[0];.    int 
32b40 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
32b50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32b60 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20   int iNextOld = 
32b70 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f  pOld->nCell + nO
32b80 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
32b90 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f   iOverflow = (nO
32ba0 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e  verflow ? pOld->
32bb0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d  aOvfl[0].idx : -
32bc0 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
32bf0 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
32c00 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
32c10 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c30 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
32c40 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
32c50 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
32c60 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
32c70 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
32c80 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
32c90 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
32ca0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
32cb0 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
32cc0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
32cd0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
32ce0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
32cf0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
32d00 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
32d10 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
32d20 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
32d30 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
32d40 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
32d50 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
32d60 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
32d70 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70         pOld = ap
32d80 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20  Copy[++j];.     
32d90 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20     iNextOld = i 
32da0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
32db0 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64  ld->nCell + pOld
32dc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
32dd0 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e       if( pOld->n
32de0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32df0 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20        nOverflow 
32e00 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
32e10 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  w;.          iOv
32e20 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65  erflow = i + !le
32e30 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61  afData + pOld->a
32e40 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20  Ovfl[0].idx;.   
32e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
32e60 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66  sDivider = !leaf
32e70 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a  Data;  .      }.
32e80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
32e90 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76  verflow>0 || iOv
32ea0 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20  erflow<i );.    
32eb0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
32ec0 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f  ow<2 || pOld->aO
32ed0 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64  vfl[0].idx==pOld
32ee0 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31  ->aOvfl[1].idx-1
32ef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32f00 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70  nOverflow<3 || p
32f10 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
32f20 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32  x==pOld->aOvfl[2
32f30 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
32f40 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77  if( i==iOverflow
32f50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69   ){.        isDi
32f60 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  vider = 1;.     
32f70 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66     if( (--nOverf
32f80 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  low)>0 ){.      
32f90 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b      iOverflow++;
32fa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32fb0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d   }..      if( i=
32fc0 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20  =cntNew[k] ){.  
32fd0 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20        /* Cell i 
32fe0 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65  is the cell imme
32ff0 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
33000 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  g the last cell 
33010 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  on new.        *
33020 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b  * sibling page k
33030 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  . If the sibling
33040 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70  s are not leaf p
33050 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20  ages of an.     
33060 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74     ** intkey b-t
33070 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69  ree, then cell i
33080 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65   is a divider ce
33090 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ll.  */.        
330a0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b  pNew = apNew[++k
330b0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ];.        if( !
330c0 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69  leafData ) conti
330d0 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
330e0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c     assert( j<nOl
330f0 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
33100 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20  t( k<nNew );..  
33110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65      /* If the ce
33120 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  ll was originall
33130 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28  y divider cell (
33140 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20  and is not now) 
33150 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f  or.      ** an o
33160 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72  verflow cell, or
33170 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73   if the cell was
33180 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69   located on a di
33190 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a  fferent sibling.
331a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65        ** page be
331b0 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69  fore the balanci
331c0 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  ng, then the poi
331d0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
331e0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20   associated.    
331f0 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68    ** with any ch
33200 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
33210 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
33220 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20   updated.  */.  
33230 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65      if( isDivide
33240 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21  r || pOld->pgno!
33250 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
33260 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
33270 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
33280 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
33290 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
332a0 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d  apCell[i]), PTRM
332b0 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e  AP_BTREE, pNew->
332c0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
332d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
332e0 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77  ( szCell[i]>pNew
332f0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
33300 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
33310 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61  tOvflPtr(pNew, a
33320 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a  pCell[i], &rc);.
33330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33340 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
33350 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
33360 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
33370 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
33380 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79  .        u32 key
33390 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e   = get4byte(&apN
333a0 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29  ew[i]->aData[8])
333b0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
333c0 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54  Put(pBt, key, PT
333d0 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65  RMAP_BTREE, apNe
333e0 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  w[i]->pgno, &rc)
333f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
33400 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68  .#if 0.    /* Th
33410 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67  e ptrmapCheckPag
33420 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73  es() contains as
33430 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
33440 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68  s that verify th
33450 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f  at.    ** all po
33460 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20  inter map pages 
33470 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c  are set correctl
33480 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66  y. This is helpf
33490 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a  ul while .    **
334a0 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73   debugging. This
334b0 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61   is usually disa
334c0 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63  bled because a c
334d0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
334e0 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65  may.    ** cause
334f0 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
33500 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20  tement to fail. 
33510 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68   */.    ptrmapCh
33520 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20  eckPages(apNew, 
33530 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61  nNew);.    ptrma
33540 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61  pCheckPages(&pPa
33550 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66  rent, 1);.#endif
33560 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
33570 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
33580 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  );.  TRACE(("BAL
33590 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20  ANCE: finished: 
335a0 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
335b0 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
335c0 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c       nOld, nNew,
335d0 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a   nCell));..  /*.
335e0 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
335f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
33600 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
33610 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63  nup:.  sqlite3Sc
33620 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
33630 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
33640 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
33650 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
33660 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
33670 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
33680 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
33690 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
336a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
336b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
336c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
336d0 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74  ed when the root
336e0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
336f0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a  e structure is.*
33700 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20  * overfull (has 
33710 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
33720 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a  flow pages)..**.
33730 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70  ** A new child p
33740 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  age is allocated
33750 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
33760 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  s of the current
33770 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69   root.** page, i
33780 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f  ncluding overflo
33790 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70  w cells, are cop
337a0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69  ied into the chi
337b0 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20  ld. The root.** 
337c0 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65  page is then ove
337d0 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65  rwritten to make
337e0 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67   it an empty pag
337f0 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74  e with the right
33800 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74  -child .** point
33810 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  er pointing to t
33820 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a  he new page..**.
33830 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
33840 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72  ing, all pointer
33850 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
33860 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
33870 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ges .** that the
33880 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20   new child-page 
33890 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  now contains poi
338a0 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64  nters to are upd
338b0 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74  ated. The.** ent
338c0 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ry corresponding
338d0 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68   to the new righ
338e0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
338f0 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  of the root.** p
33900 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61  age is also upda
33910 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ted..**.** If su
33920 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69  ccessful, *ppChi
33930 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e  ld is set to con
33940 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
33950 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a   to the child .*
33960 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54  * page and SQLIT
33970 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
33980 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
33990 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71  he caller is req
339a0 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c  uired.** to call
339b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f   releasePage() o
339c0 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74  n *ppChild exact
339d0 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65  ly once. If an e
339e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
339f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
33a00 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
33a10 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f  pChild is set to
33a20 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
33a30 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
33a40 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c  (MemPage *pRoot,
33a50 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69   MemPage **ppChi
33a60 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  ld){.  int rc;  
33a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
33a90 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
33aa0 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
33ab0 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20  mPage *pChild = 
33ac0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
33ad0 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
33ae0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
33af0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
33b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b10 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
33b20 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  f the new child 
33b30 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  page */.  BtShar
33b40 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d  ed *pBt = pRoot-
33b50 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  >pBt;    /* The 
33b60 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65  BTree */..  asse
33b70 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  rt( pRoot->nOver
33b80 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65  flow>0 );.  asse
33b90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33ba0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
33bb0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  x) );..  /* Make
33bc0 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74   pRoot, the root
33bd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
33be0 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41  ree, writable. A
33bf0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20  llocate a new . 
33c00 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69   ** page that wi
33c10 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
33c20 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  w right-child of
33c30 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65   pPage. Copy the
33c40 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f   contents.  ** o
33c50 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65  f the node store
33c60 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20  d on pRoot into 
33c70 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
33c80 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ge..  */.  rc = 
33c90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33ca0 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
33cb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
33cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
33cd0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
33ce0 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64  Page(pBt,&pChild
33cf0 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f  ,&pgnoChild,pRoo
33d00 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20  t->pgno,0);.    
33d10 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
33d20 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26  pRoot, pChild, &
33d30 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  rc);.    if( ISA
33d40 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
33d50 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
33d60 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52  , pgnoChild, PTR
33d70 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74  MAP_BTREE, pRoot
33d80 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
33d90 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
33da0 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64   ){.    *ppChild
33db0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
33dc0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
33dd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33de0 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  }.  assert( sqli
33df0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33e00 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50  ble(pChild->pDbP
33e10 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
33e20 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33e30 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d  writeable(pRoot-
33e40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
33e50 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
33e60 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65  Cell==pRoot->nCe
33e70 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  ll );..  TRACE((
33e80 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
33e90 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
33ea0 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  ", pRoot->pgno, 
33eb0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
33ec0 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f  .  /* Copy the o
33ed0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72  verflow cells fr
33ee0 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69  om pRoot to pChi
33ef0 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70  ld */.  memcpy(p
33f00 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52  Child->aOvfl, pR
33f10 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  oot->aOvfl, pRoo
33f20 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
33f30 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c  eof(pRoot->aOvfl
33f40 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d  [0]));.  pChild-
33f50 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f  >nOverflow = pRo
33f60 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a  ot->nOverflow;..
33f70 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f    /* Zero the co
33f80 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e  ntents of pRoot.
33f90 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43   Then install pC
33fa0 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67 68  hild as the righ
33fb0 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65  t-child. */.  ze
33fc0 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43  roPage(pRoot, pC
33fd0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
33fe0 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
33ff0 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  ut4byte(&pRoot->
34000 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
34010 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
34020 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69  hild);..  *ppChi
34030 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72  ld = pChild;.  r
34040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
34060 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
34070 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
34080 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
34090 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
340a0 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
340b0 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
340c0 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
340d0 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
340e0 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
340f0 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
34100 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
34110 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
34120 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
34130 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20  tine. Balancing 
34140 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a  routines are:.**
34150 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75  .**   balance_qu
34160 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  ick().**   balan
34170 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20  ce_deeper().**  
34180 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34190 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ().*/.static int
341a0 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f   balance(BtCurso
341b0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
341c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
341d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e    const int nMin
341e0 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73   = pCur->pBt->us
341f0 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33  ableSize * 2 / 3
34200 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51  ;.  u8 aBalanceQ
34210 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20  uickSpace[13];. 
34220 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a   u8 *pFree = 0;.
34230 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
34240 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63   balance_quick_c
34250 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54  alled = 0 );.  T
34260 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
34270 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
34280 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20  ed = 0 );..  do 
34290 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
342a0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
342b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
342c0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
342d0 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66  [iPage];..    if
342e0 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( iPage==0 ){.  
342f0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
34300 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
34310 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
34320 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
34330 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ee is overfull. 
34340 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6c  In this case cal
34350 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  l the.        **
34360 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
34370 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72  ) function to cr
34380 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
34390 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
343a0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  ge.        ** an
343b0 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72 65  d copy the curre
343c0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
343d0 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20  he root-page to 
343e0 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  it. The.        
343f0 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  ** next iteratio
34400 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
34410 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
34420 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  e child page..  
34430 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20        */ .      
34440 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e    assert( (balan
34450 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
34460 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
34470 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
34480 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70 43  eeper(pPage, &pC
34490 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a  ur->apPage[1]);.
344a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
344b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
344c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61         pCur->iPa
344d0 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ge = 1;.        
344e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
344f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
34500 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d  pCur->aiIdx[1] =
34510 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   0;.          as
34520 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
34530 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ge[1]->nOverflow
34540 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
34550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
34570 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
34580 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34590 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ==0 && pPage->nF
345a0 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20  ree<=nMin ){.   
345b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
345c0 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  lse{.      MemPa
345d0 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65  ge * const pPare
345e0 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  nt = pCur->apPag
345f0 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20  e[iPage-1];.    
34600 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78    int const iIdx
34610 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69   = pCur->aiIdx[i
34620 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20  Page-1];..      
34630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34640 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
34650 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
34660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34670 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  K ){.#ifndef SQL
34680 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
34690 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66  LANCE.        if
346a0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
346b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
346c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
346d0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
346e0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
346f0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20  ==pPage->nCell. 
34700 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
34710 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20  nt->pgno!=1.    
34720 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d       && pParent-
34730 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20  >nCell==iIdx.   
34740 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
34750 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63    /* Call balanc
34760 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65  e_quick() to cre
34770 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e  ate a new siblin
34780 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68  g of pPage on wh
34790 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ich.          **
347a0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76   to store the ov
347b0 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c  erflow cell. bal
347c0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73  ance_quick() ins
347d0 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a  erts a new cell.
347e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74            ** int
347f0 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68  o pParent, which
34800 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65   may cause pPare
34810 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20  nt overflow. If 
34820 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
34830 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e  * happens, the n
34840 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f  ext interation o
34850 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69  f the do-loop wi
34860 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65  ll balance pPare
34870 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nt .          **
34880 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c 61   use either bala
34890 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72  nce_nonroot() or
348a0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
348b0 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20  ). Until this.  
348c0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
348d0 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ns, the overflow
348e0 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20   cell is stored 
348f0 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  in the aBalanceQ
34900 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20  uickSpace[].    
34910 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
34920 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
34930 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20           ** The 
34940 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66  purpose of the f
34950 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
34960 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ) is to check th
34970 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20  at only a.      
34980 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61      ** single ca
34990 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75  ll to balance_qu
349a0 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f  ick() is made fo
349b0 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74  r each call to t
349c0 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
349d0 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
349e0 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69  is were not veri
349f0 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62  fied, a subtle b
34a00 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75  ug involving reu
34a10 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  se.          ** 
34a20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51  of the aBalanceQ
34a30 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68  uickSpace[] migh
34a40 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20  t sneak in..    
34a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34a60 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
34a70 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
34a80 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ++)==0 );.      
34a90 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
34aa0 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20  _quick(pParent, 
34ab0 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51  pPage, aBalanceQ
34ac0 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20  uickSpace);.    
34ad0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
34ae0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
34af0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
34b00 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  case, call balan
34b10 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20  ce_nonroot() to 
34b20 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65 6c  redistribute cel
34b30 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
34b40 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e  between pPage an
34b50 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73  d up to 2 of its
34b60 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20   sibling pages. 
34b70 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20  This involves.  
34b80 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
34b90 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
34ba0 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68  s of pParent, wh
34bb0 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
34bc0 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20  arent to.       
34bd0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65     ** become ove
34be0 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
34bf0 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65  ll. The next ite
34c00 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
34c10 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20  -loop.          
34c20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  ** will balance 
34c30 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
34c40 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e  to correct this.
34c50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20  .          ** . 
34c60 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
34c70 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
34c80 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
34c90 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
34ca0 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20  ll or cells.    
34cb0 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f        ** are sto
34cc0 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61 63  red in the pSpac
34cd0 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  e buffer allocat
34ce0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62  ed immediately b
34cf0 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20  elow. .         
34d00 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74   ** A subsequent
34d10 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34d20 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64  e do-loop will d
34d30 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62 79  eal with this by
34d40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
34d50 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f  lling balance_no
34d60 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65  nroot() (balance
34d70 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62 65  _deeper() may be
34d80 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20   called first,. 
34d90 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20           ** but 
34da0 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20  it doesn't deal 
34db0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65  with overflow ce
34dc0 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73  lls - just moves
34dd0 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20   them to a.     
34de0 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e       ** differen
34df0 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68  t page). Once th
34e00 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  is subsequent ca
34e10 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
34e20 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20  nroot() .       
34e30 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65     ** has comple
34e40 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65 20  ted, it is safe 
34e50 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 70  to release the p
34e60 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65  Space buffer use
34e70 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a  d by.          *
34e80 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  * the previous c
34e90 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72  all, as the over
34ea0 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77  flow cell data w
34eb0 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20  ill have been . 
34ec0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69           ** copi
34ed0 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  ed either into t
34ee0 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74  he body of a dat
34ef0 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e  abase page or in
34f00 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20  to the new.     
34f10 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62       ** pSpace b
34f20 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
34f30 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20  the latter call 
34f40 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
34f50 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ot()..          
34f60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  */.          u8 
34f70 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  *pSpace = sqlite
34f80 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72  3PageMalloc(pCur
34f90 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
34fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
34fb0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
34fc0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20  (pParent, iIdx, 
34fd0 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31  pSpace, iPage==1
34fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
34ff0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
35000 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65        /* If pFre
35010 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  e is not NULL, i
35020 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
35030 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
35040 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed .            
35050 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75 73  ** by a previous
35060 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
35070 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20  _nonroot(). Its 
35080 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20  contents are.   
35090 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20           ** now 
350a0 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e  stored either on
350b0 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20 70   real database p
350c0 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74  ages or within t
350d0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
350e0 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62 75  ** new pSpace bu
350f0 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20  ffer, so it may 
35100 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64 20  be safely freed 
35110 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  here. */.       
35120 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
35130 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20  Free(pFree);.   
35140 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35150 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63      /* The pSpac
35160 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  e buffer will be
35170 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68 65   freed after the
35180 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20   next call to.  
35190 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
351a0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72  ce_nonroot(), or
351b0 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68 69   just before thi
351c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
351d0 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20  ns, whichever.  
351e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73          ** comes
351f0 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20   first. */.     
35200 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53 70       pFree = pSp
35210 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ace;.        }. 
35220 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50       }..      pP
35230 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
35240 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   0;..      /* Th
35250 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
35260 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
35270 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72  balances the par
35280 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ent page. */.   
35290 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
352a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75  Page);.      pCu
352b0 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
352c0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
352d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
352e0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
352f0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
35300 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  (pFree);.  }.  r
35310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
35320 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
35330 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
35340 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79   BTree.  The key
35350 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b   is given by (pK
35360 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20  ey,nKey).** and 
35370 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76 65  the data is give
35380 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74  n by (pData,nDat
35390 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  a).  The cursor 
353a0 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a  is used only to.
353b0 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20 74  ** define what t
353c0 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20  able the record 
353d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
353e0 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75  ed into.  The cu
353f0 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20  rsor.** is left 
35400 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61  pointing at a ra
35410 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  ndom location..*
35420 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b  *.** For an INTK
35430 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74  EY table, only t
35440 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66  he nKey value of
35450 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65 64   the key is used
35460 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67  .  pKey is.** ig
35470 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45  nored.  For a ZE
35480 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68  RODATA table, th
35490 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74  e pData and nDat
354a0 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72  a are both ignor
354b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
354c0 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
354d0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
354e0 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65 73  o, then a succes
354f0 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  sful call to.** 
35500 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
35510 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
35520 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
35530 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
35540 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
35550 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
35560 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
35570 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
35580 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
35590 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
355a0 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
355b0 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
355c0 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
355d0 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
355e0 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
355f0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
35600 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
35610 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
35620 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
35630 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
35640 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
35650 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
35660 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ur may point to 
35670 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72  any .** entry or
35680 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20   to no entry at 
35690 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  all. In this cas
356a0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
356b0 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
356c0 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
356d0 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
356e0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
356f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35700 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
35710 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
35720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
35730 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
35740 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
35750 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
35760 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
35770 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
35780 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
35790 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
357a0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
357b0 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
357c0 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
357d0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
357e0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35800 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
35810 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
35820 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
35830 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
35840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35850 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
35860 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
35870 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
35880 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
35890 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
358a0 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
358b0 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
358c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
358d0 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
358e0 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a  Result;.  int sz
358f0 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  New;.  int idx;.
35900 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35910 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
35920 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
35930 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
35940 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
35950 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b  d char *oldCell;
35960 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35970 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a   *newCell = 0;..
35980 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
35990 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
359a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
359b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
359c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
359d0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
359e0 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61  ipNext;.  }..  a
359f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35a00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35a10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
35a20 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  >wrFlag && pBt->
35a30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
35a40 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70  RANS_WRITE && !p
35a50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
35a60 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
35a70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
35a80 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
35a90 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
35aa0 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
35ab0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
35ac0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62  the caller has b
35ad0 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20  een consistent. 
35ae0 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  If this cursor w
35af0 61 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65  as opened.  ** e
35b00 78 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65  xpecting an inde
35b10 78 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74  x b-tree, then t
35b20 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
35b30 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c   be inserting bl
35b40 6f 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74  ob.  ** keys wit
35b50 68 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  h no associated 
35b60 64 61 74 61 2e 20 49 66 20 74 68 65 20 63 75 72  data. If the cur
35b70 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65  sor was opened e
35b80 78 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a  xpecting an.  **
35b90 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
35ba0 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
35bb0 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e   be inserting in
35bc0 74 65 67 65 72 20 6b 65 79 73 20 77 69 74 68 20  teger keys with 
35bd0 61 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  a.  ** blob of a
35be0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
35bf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
35c00 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
35c10 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
35c20 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
35c30 20 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   an insert into 
35c40 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
35c50 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
35c60 6e 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75  ncrblob .  ** cu
35c70 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
35c80 65 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c  e row being repl
35c90 61 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74  aced (assuming t
35ca0 68 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65  his is a replace
35cb0 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
35cc0 2d 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  - if it is not, 
35cd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
35ce0 20 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20   a no-op).  */. 
35cf0 20 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49   if( pCur->pKeyI
35d00 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  nfo==0 ){.    in
35d10 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
35d20 43 75 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d  Cursors(p, pCur-
35d30 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
35d40 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   0);.  }..  /* S
35d50 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
35d60 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
35d70 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
35d80 68 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  his table..  **.
35d90 20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73    ** In some cas
35da0 65 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  es, the call to 
35db0 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65  btreeMoveto() be
35dc0 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  low is a no-op. 
35dd0 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65  For.  ** example
35de0 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  , when inserting
35df0 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
35e00 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e  le with auto-gen
35e10 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20  erated integer. 
35e20 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44   ** keys, the VD
35e30 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73  BE layer invokes
35e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
35e50 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
35e60 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65  t the .  ** inte
35e70 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20  ger key to use. 
35e80 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
35e90 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61  is function to a
35ea0 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74  ctually insert t
35eb0 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e  he .  ** data in
35ec0 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d  to the intkey B-
35ed0 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
35ee0 73 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29  se btreeMoveto()
35ef0 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a   recognizes.  **
35f00 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
35f10 20 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72   is already wher
35f20 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  e it needs to be
35f30 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74   and returns wit
35f40 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  hout.  ** doing 
35f50 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f  any work. To avo
35f60 69 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65  id thwarting the
35f70 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  se optimizations
35f80 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
35f90 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c  t.  ** not to cl
35fa0 65 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68  ear the cursor h
35fb0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ere..  */.  rc =
35fc0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
35fd0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
35fe0 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
35ff0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36000 3b 0a 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a  ;.  if( !loc ){.
36010 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f      rc = btreeMo
36020 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c  veto(pCur, pKey,
36030 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61   nKey, appendBia
36040 73 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66  s, &loc);.    if
36050 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
36060 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
36070 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
36080 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
36090 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
360a0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
360b0 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
360c0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
360d0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
360e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
360f0 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
36100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36110 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
36120 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ge->intKey );.. 
36130 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
36140 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
36150 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
36160 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
36170 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
36180 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
36190 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
361a0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
361b0 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
361c0 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
361d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
361e0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
361f0 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
36200 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
36210 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
36220 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
36230 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
36240 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
36250 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
36260 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
36270 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
36280 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
36290 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
362a0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
362b0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
362c0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
362d0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
362e0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
362f0 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
36300 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
36310 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
36320 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
36330 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36  oc==0 ){.    u16
36340 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
36350 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e  rt( idx<pPage->n
36360 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
36370 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36380 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
36390 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
363a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
363b0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
363c0 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e     oldCell = fin
363d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
363e0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
363f0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
36400 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
36410 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
36420 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
36430 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
36440 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
36450 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
36460 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
36470 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
36480 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 2c  age, idx, szOld,
36490 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
364a0 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
364b0 65 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ert;.  }else if(
364c0 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
364d0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
364e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
364f0 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
36500 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
36510 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
36520 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
36530 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
36540 0a 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65 6c  .  }.  insertCel
36550 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65  l(pPage, idx, ne
36560 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c  wCell, szNew, 0,
36570 20 30 2c 20 26 72 63 29 3b 0a 20 20 61 73 73 65   0, &rc);.  asse
36580 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
36590 4b 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  K || pPage->nCel
365a0 6c 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  l>0 || pPage->nO
365b0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20  verflow>0 );..  
365c0 2f 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68  /* If no error h
365d0 61 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70  as occured and p
365e0 50 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72  Page has an over
365f0 66 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20  flow cell, call 
36600 62 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20  balance() .  ** 
36610 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
36620 74 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e  the cells within
36630 20 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65   the tree. Since
36640 20 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d   balance() may m
36650 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
36660 73 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74  sor, zero the Bt
36670 43 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a  Cursor.info.nSiz
36680 65 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76  e and BtCursor.v
36690 61 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61  alidNKey.  ** va
366a0 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20  riables..  **.  
366b0 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
366c0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
366d0 61 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74  alled moveToRoot
366e0 28 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63  () to move the c
366f0 75 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20  ursor.  ** back 
36700 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
36710 20 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73   as balance() us
36720 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ed to invalidate
36730 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
36740 2a 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61  ** of BtCursor.a
36750 70 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75  pPage[] and BtCu
36760 72 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e  rsor.aiIdx[]. In
36770 73 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74  stead of doing t
36780 68 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  hat,.  ** set th
36790 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74  e cursor state t
367a0 6f 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69  o "invalid". Thi
367b0 73 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69  s makes common i
367c0 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
367d0 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66  .  ** slightly f
367e0 61 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  aster..  **.  **
367f0 20 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74   There is a subt
36800 6c 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74  le but important
36810 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65   optimization he
36820 72 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73  re too. When ins
36830 65 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74  erting.  ** mult
36840 69 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74  iple records int
36850 6f 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72  o an intkey b-tr
36860 65 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  ee using a singl
36870 65 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e  e cursor (as can
36880 0a 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69  .  ** happen whi
36890 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  le processing an
368a0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e   "INSERT INTO ..
368b0 2e 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d  . SELECT" statem
368c0 65 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73  ent), it.  ** is
368d0 20 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f   advantageous to
368e0 20 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f   leave the curso
368f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
36900 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a  e last entry in.
36910 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
36920 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20  if possible. If 
36930 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
36940 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
36950 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74  he last.  ** ent
36960 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  ry in the table,
36970 20 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f   and the next ro
36980 77 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61  w inserted has a
36990 6e 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20  n integer key.  
369a0 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ** larger than t
369b0 68 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74  he largest exist
369c0 69 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70  ing key, it is p
369d0 6f 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72  ossible to inser
369e0 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77  t the.  ** row w
369f0 69 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74  ithout seeking t
36a00 68 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20  he cursor. This 
36a10 63 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72  can be a big per
36a20 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a  formance boost..
36a30 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66    */.  pCur->inf
36a40 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
36a50 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
36a60 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   0;.  if( rc==SQ
36a70 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
36a80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
36a90 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
36aa0 70 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  pCur);..    /* M
36ab0 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f  ust make sure nO
36ac0 76 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74  verflow is reset
36ad0 20 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66   to zero even if
36ae0 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20   the balance(). 
36af0 20 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74     ** fails. Int
36b00 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
36b10 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ture corruption 
36b20 77 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65  will result othe
36b30 72 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41  rwise. .    ** A
36b40 6c 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72  lso, set the cur
36b50 73 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76  sor state to inv
36b60 61 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73  alid. This stops
36b70 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
36b80 69 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f  ion().    ** fro
36b90 6d 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  m trying to save
36ba0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
36bb0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72  ition of the cur
36bc0 73 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75  sor.  */.    pCu
36bd0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
36be0 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  iPage]->nOverflo
36bf0 77 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  w = 0;.    pCur-
36c00 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
36c10 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
36c20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
36c30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36c40 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  ]->nOverflow==0 
36c50 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a  );..end_insert:.
36c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36c70 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
36c80 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
36c90 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
36ca0 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73  ng to.  The curs
36cb0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
36cc0 69 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69  inting at a arbi
36cd0 74 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a  trary location..
36ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
36cf0 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
36d00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
36d10 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
36d20 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
36d30 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
36d50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
36d80 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ode */.  MemPage
36d90 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36db0 20 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20   Page to delete 
36dc0 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  cell from */.  u
36dd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
36de0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36df0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
36e00 6f 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65  o cell to delete
36e10 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49   */.  int iCellI
36e20 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
36e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36e40 64 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64  dex of cell to d
36e50 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  elete */.  int i
36e60 43 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20  CellDepth;      
36e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e80 2f 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65  /* Depth of node
36e90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c   containing pCel
36ea0 6c 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28  l */ ..  assert(
36eb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
36ec0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
36ed0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
36ee0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
36ef0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
36f00 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
36f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
36f20 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
36f30 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
36f40 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
36f50 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
36f60 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  t, pCur->pKeyInf
36f70 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73  o!=0, 2) );.  as
36f80 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
36f90 6e 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d  nflicts(p, pCur-
36fa0 3e 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20  >pgnoRoot) );.. 
36fb0 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
36fc0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
36fd0 67 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]>=pCur->apPag
36fe0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
36ff0 6e 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45  nCell) .   || NE
37000 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
37010 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  !=CURSOR_VALID).
37020 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
37030 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f  SQLITE_ERROR;  /
37040 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
37050 67 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20  gone awry. */.  
37060 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
37070 69 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72  is a delete oper
37080 61 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20  ation to remove 
37090 61 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62  a row from a tab
370a0 6c 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20  le b-tree,.  ** 
370b0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
370c0 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
370d0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20  open on the row 
370e0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20  being deleted.  
370f0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
37100 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
37110 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
37120 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
37130 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
37140 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20  Cur->info.nKey, 
37150 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c  0);.  }..  iCell
37160 44 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50  Depth = pCur->iP
37170 61 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20  age;.  iCellIdx 
37180 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43  = pCur->aiIdx[iC
37190 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61  ellDepth];.  pPa
371a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
371b0 65 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  e[iCellDepth];. 
371c0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
371d0 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
371e0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  x);..  /* If the
371f0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
37200 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65   the entry to de
37210 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
37220 61 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20  af page, move.  
37230 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ** the cursor to
37240 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74   the largest ent
37250 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 74  ry in the tree t
37260 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  hat is smaller t
37270 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74  han.  ** the ent
37280 72 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ry being deleted
37290 2e 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c  . This cell will
372a0 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c   replace the cel
372b0 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a  l being deleted.
372c0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
372d0 74 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65  ternal node. The
372e0 20 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72   'previous' entr
372f0 79 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68  y is used for th
37300 69 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20  is instead.  ** 
37310 6f 66 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e  of the 'next' en
37320 74 72 79 2c 20 61 73 20 74 68 65 20 70 72 65 76  try, as the prev
37330 69 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c  ious entry is al
37340 77 61 79 73 20 61 20 70 61 72 74 20 6f 66 20 74  ways a part of t
37350 68 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65  he.  ** sub-tree
37360 20 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63   headed by the c
37370 68 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65  hild page of the
37380 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37390 74 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a  ted. This makes.
373a0 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74    ** balancing t
373b0 68 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e  he tree followin
373c0 67 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65  g the delete ope
373d0 72 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20  ration easier.  
373e0 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
373f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
37400 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 72 63   notUsed;.    rc
37410 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
37420 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e  revious(pCur, &n
37430 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
37440 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
37450 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20  .  }..  /* Save 
37460 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
37470 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
37480 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
37490 74 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a  table before.  *
374a0 2a 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64  * making any mod
374b0 69 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65  ifications. Make
374c0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
374d0 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
374e0 6f 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74  o be .  ** delet
374f0 65 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65  ed writable. The
37500 6e 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66  n free any overf
37510 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
37520 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20  ated with the . 
37530 20 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69   ** entry and fi
37540 6e 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65  nally remove the
37550 20 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f   cell itself fro
37560 6d 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  m within the pag
37570 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  e.  .  */.  rc =
37580 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
37590 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
375a0 6f 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66  oot, pCur);.  if
375b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
375c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
375d0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
375e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
375f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
37600 3b 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65  ;.  rc = clearCe
37610 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
37620 3b 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61  ;.  dropCell(pPa
37630 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65  ge, iCellIdx, ce
37640 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
37650 20 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b 0a 20   pCell), &rc);. 
37660 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
37670 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68   rc;..  /* If th
37680 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77  e cell deleted w
37690 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f  as not located o
376a0 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  n a leaf page, t
376b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20  hen the cursor. 
376c0 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79   ** is currently
376d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
376e0 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69   largest entry i
376f0 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68  n the sub-tree h
37700 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eaded.  ** by th
37710 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20  e child-page of 
37720 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61  the cell that wa
37730 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66  s just deleted f
37740 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a  rom an internal.
37750 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63    ** node. The c
37760 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61  ell from the lea
37770 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20  f node needs to 
37780 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
37790 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
377a0 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  de to replace th
377b0 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20  e deleted cell. 
377c0 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
377d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65  ->leaf ){.    Me
377e0 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70  mPage *pLeaf = p
377f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
37800 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
37810 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e  t nCell;.    Pgn
37820 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  o n = pCur->apPa
37830 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d  ge[iCellDepth+1]
37840 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69  ->pgno;.    unsi
37850 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b  gned char *pTmp;
37860 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  ..    pCell = fi
37870 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c  ndCell(pLeaf, pL
37880 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  eaf->nCell-1);. 
37890 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53     nCell = cellS
378a0 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43  izePtr(pLeaf, pC
378b0 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ell);.    assert
378c0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
378d0 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20  Bt)>=nCell );.. 
378e0 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
378f0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70  pace(pBt);.    p
37900 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53  Tmp = pBt->pTmpS
37910 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20  pace;..    rc = 
37920 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37930 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65  e(pLeaf->pDbPage
37940 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  );.    insertCel
37950 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64  l(pPage, iCellId
37960 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c  x, pCell-4, nCel
37970 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 2c 20 26 72  l+4, pTmp, n, &r
37980 63 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  c);.    dropCell
37990 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e  (pLeaf, pLeaf->n
379a0 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 2c 20 26  Cell-1, nCell, &
379b0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
379c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
379d0 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74  ..  /* Balance t
379e0 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20  he tree. If the 
379f0 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61  entry deleted wa
37a00 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  s located on a l
37a10 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74  eaf page,.  ** t
37a20 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73  hen the cursor s
37a30 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  till points to t
37a40 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69  hat page. In thi
37a50 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74  s case the first
37a60 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61  .  ** call to ba
37a70 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20  lance() repairs 
37a80 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68  the tree, and th
37a90 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74  e if(...) condit
37aa0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65  ion is.  ** neve
37ab0 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a  r true..  **.  *
37ac0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
37ad0 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
37ae0 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65  d was on an inte
37af0 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20  rnal node page, 
37b00 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69  then.  ** pCur i
37b10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
37b20 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  e leaf page from
37b30 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61   which a cell wa
37b40 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  s removed to.  *
37b50 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65  * replace the ce
37b60 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  ll deleted from 
37b70 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
37b80 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
37b90 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20  tly.  ** tricky 
37ba0 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  as the leaf node
37bb0 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c   may be underful
37bc0 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72  l, and the inter
37bd0 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a  nal node may.  *
37be0 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65  * be either unde
37bf0 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49  r or overfull. I
37c00 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20  n this case run 
37c10 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c  the balancing al
37c20 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20  gorithm.  ** on 
37c30 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69  the leaf node fi
37c40 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61  rst. If the bala
37c50 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72  nce proceeds far
37c60 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20   enough up the. 
37c70 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65   ** tree that we
37c80 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
37c90 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e  t any problem in
37ca0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
37cb0 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  de has.  ** been
37cc0 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62   corrected, so b
37cd0 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  e it. Otherwise,
37ce0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
37cf0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a   the leaf node,.
37d00 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75    ** walk the cu
37d10 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65  rsor up the tree
37d20 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
37d30 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63   node and balanc
37d40 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65  e it as .  ** we
37d50 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62  ll.  */.  rc = b
37d60 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20  alance(pCur);.  
37d70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37d80 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  K && pCur->iPage
37d90 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20  >iCellDepth ){. 
37da0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
37db0 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
37dc0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
37dd0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
37de0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
37df0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ]);.    }.    rc
37e00 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
37e10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
37e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37e30 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
37e40 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
37e50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
37e60 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
37e70 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
37e80 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
37e90 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
37ea0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
37eb0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
37ec0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
37ed0 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
37ee0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
37ef0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
37f00 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
37f10 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
37f20 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
37f30 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
37f40 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
37f50 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
37f60 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
37f70 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
37f80 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
37f90 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
37fa0 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
37fb0 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
37fc0 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
37fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
37fe0 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
37ff0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
38000 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
38010 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
38020 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
38030 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
38040 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
38050 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
38060 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
38070 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
38080 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
38090 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
380a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
380b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
380c0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
380d0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
380e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
380f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
38100 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
38110 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
38120 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
38130 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
38140 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
38150 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
38160 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
38170 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
38180 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
38190 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
381a0 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
381b0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
381c0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
381d0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
381e0 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
381f0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
38200 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
38210 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
38220 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
38230 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
38240 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
38250 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
38260 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
38270 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
38280 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
38290 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
382a0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
382b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
382c0 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
382d0 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
382e0 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
382f0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
38300 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
38310 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
38320 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
38330 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
38340 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
38350 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
38360 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
38370 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
38380 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
38390 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
383a0 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
383b0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
383c0 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
383d0 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
383e0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
383f0 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
38400 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
38410 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
38420 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53 54  p, BTREE_LARGEST
38430 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67 6e  _ROOT_PAGE, &pgn
38440 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e 6f  oRoot);.    pgno
38450 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  Root++;..    /* 
38460 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  The new root-pag
38470 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c  e may not be all
38480 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e  ocated on a poin
38490 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72  ter-map page, or
384a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44   the.    ** PEND
384b0 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20