/ Hex Artifact Content
Login

Artifact 46f5eb09a9dc3af84d04c18f0feea3384fecca58:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 36 38 32 20 32 30 30 39 2f 30  c,v 1.682 2009/0
0190: 37 2f 31 32 20 30 32 3a 33 32 3a 32 32 20 64 72  7/12 02:32:22 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 3b 0a 20 20     int nPage;.  
43f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
4400: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
4410: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
4420: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
4430: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4440: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4450: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4460: 65 63 43 72 65 61 74 65 28 28 75 33 32 29 6e 50  ecCreate((u32)nP
4470: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
4480: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4490: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
44a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
44b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
44c0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
44d0: 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73  TE_OK && pgno<=s
44e0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
44f0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4500: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  t) ){.    rc = s
4510: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
4520: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4530: 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
4540: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4550: 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53  ** Query the BtS
4560: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4570: 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t vector..**.** 
4580: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
4590: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66   called when a f
45a0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
45b0: 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  ge is removed fr
45c0: 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c  om the.** free-l
45d0: 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49  ist for reuse. I
45e0: 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  t returns false 
45f0: 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  if it is safe to
4600: 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a   retrieve the.**
4610: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
4620: 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
4630: 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
4640: 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20   flag set. True 
4650: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
4660: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
4670: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4680: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4690: 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20  pgno){.  Bitvec 
46a0: 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f  *p = pBt->pHasCo
46b0: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
46c0: 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69  (p && (pgno>sqli
46d0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29  te3BitvecSize(p)
46e0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
46f0: 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29  cTest(p, pgno)))
4700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4710: 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42   (destroy) the B
4720: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4730: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4740: 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e   should be.** in
4750: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
4760: 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20  clusion of each 
4770: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
4780: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
4790: 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43  d btreeClearHasC
47a0: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
47b0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
47c0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42  BitvecDestroy(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b  t->pHasContent);
47e0: 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  .  pBt->pHasCont
47f0: 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ent = 0;.}../*.*
4800: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
4810: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
4820: 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62  on in the variab
4830: 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65  les BtCursor.nKe
4840: 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73  y .** and BtCurs
4850: 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72  or.pKey. The cur
4860: 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73  sor's state is s
4870: 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51  et to CURSOR_REQ
4880: 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61  UIRESEEK..*/.sta
4890: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
48a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
48b0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
48c0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
48d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
48e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
48f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4900: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4910: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4920: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4940: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4950: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20  &pCur->nKey);.. 
4960: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
4970: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
4980: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
4990: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
49a0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
49b0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
49c0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
49d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
49e0: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
49f0: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
4a00: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
4a10: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
4a20: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
4a30: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
4a40: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
4a50: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
4a60: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
4a70: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
4a80: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
4a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4aa0: 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61  && 0==pCur->apPa
4ab0: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a  ge[0]->intKey){.
4ac0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
4ad0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
4ae0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20  (int)pCur->nKey 
4af0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20  );.    if( pKey 
4b00: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
4b10: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
4b20: 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72  ur, 0, (int)pCur
4b30: 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20  ->nKey, pKey);. 
4b40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4b50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4b60: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70    pCur->pKey = p
4b70: 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Key;.      }else
4b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b90: 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20  3_free(pKey);.  
4ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
4bb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4bc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4bd0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
4be0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4bf0: 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  intKey || !pCur-
4c00: 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20  >pKey );..  if( 
4c10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4c20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4c30: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
4c40: 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
4c50: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
4c60: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
4c70: 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
4c80: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4c90: 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
4ca0: 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43  age = -1;.    pC
4cb0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4cc0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
4cd0: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
4ce0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4cf0: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
4d00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
4d10: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
4d20: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
4d30: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
4d40: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
4d50: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
4d60: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
4d70: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
4d80: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
4d90: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
4da0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
4db0: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
4dc0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
4dd0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
4de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
4df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
4e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
4e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
4e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
4e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
4e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
4e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
4e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
4e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
4ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
4eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
4ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
4ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26  noRoot==iRoot) &
4ef0: 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  & .        p->eS
4f00: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f10: 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ID ){.      int 
4f20: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
4f30: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
4f40: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
4f50: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =rc ){.        r
4f60: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
4f70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4f80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4f90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
4fa0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
4fb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
4fc0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
4fd0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
4fe0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
4ff0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5000: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5010: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5020: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5030: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5040: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5050: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5060: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5070: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5080: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5090: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
50a0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
50b0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
50c0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
50d0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
50e0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
50f0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
5100: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
5110: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
5120: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
5130: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
5140: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
5150: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
5160: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
5170: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
5180: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
5190: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
51a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
51b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
51c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
51e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
51f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
5200: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
5210: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
5220: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
5230: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
5240: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
5250: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
5260: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
5270: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
5280: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
52b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
52c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
52d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
52e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
52f0: 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20  aSpace[150];    
5300: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
5310: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
5320: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
5330: 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b  loc */..  if( pK
5340: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5350: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5360: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5370: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5380: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5390: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
53a0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
53b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53d0: 20 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73         aSpace, s
53e0: 69 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a  izeof(aSpace));.
53f0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
5400: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
5410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
5420: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
5430: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
5440: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
5450: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
5460: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
5470: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
5480: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  ( pKey ){.    sq
5490: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
54a0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49  npackedRecord(pI
54b0: 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65  dxKey);.  }.  re
54c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
54d0: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
54e0: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
54f0: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
5500: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
5510: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
5520: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
5530: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
5540: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
5550: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
5560: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
5570: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
5580: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
5590: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
55a0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
55b0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
55c0: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
55d0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
55e0: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
55f0: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
5600: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  tion()..*/.stati
5610: 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f  c int btreeResto
5620: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5630: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5640: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
5650: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5660: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5670: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
5680: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5690: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
56a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
56b0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
56c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
56d0: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
56e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
56f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5700: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5710: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5720: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5730: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
5740: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5750: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5760: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5770: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5780: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5790: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
57a0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
57b0: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
57c0: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
57d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
57e0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
57f0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5800: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
5810: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5820: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
5830: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
5840: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5850: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
5860: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
5870: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
5880: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5890: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
58a0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
58b0: 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  on it.** was las
58c0: 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75  t placed at.  Cu
58d0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
58e0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
58f0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   are pointing.**
5900: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
5910: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
5920: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  em..**.** This r
5930: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61  outine returns a
5940: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
5950: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
5960: 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  rong.  The.** in
5970: 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64  teger *pHasMoved
5980: 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69   is set to one i
5990: 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
59a0: 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20   moved and 0 if 
59b0: 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  not..*/.int sqli
59c0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
59d0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
59e0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
59f0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
5a00: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  ;..  rc = restor
5a10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a20: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
5a30: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
5a40: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
5a50: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
5a60: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
5a70: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5a80: 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20  ur->skip!=0 ){. 
5a90: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5aa0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
5ab0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a  *pHasMoved = 0;.
5ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
5ad0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
5ae0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
5af0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
5b00: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
5b10: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
5b20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
5b30: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
5b40: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
5b50: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
5b60: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
5b70: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
5b80: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
5b90: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74   number..*/.stat
5ba0: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
5bb0: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
5bc0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
5bd0: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
5be0: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
5bf0: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
5c00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5c10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5c20: 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65  utex) );.  nPage
5c30: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
5c40: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
5c50: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
5c60: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
5c70: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
5c80: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
5c90: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
5ca0: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
5cb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
5cc0: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
5cd0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
5ce0: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
5cf0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
5d00: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
5d10: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
5d20: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
5d30: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
5d40: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
5d50: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
5d60: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
5d70: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
5d80: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
5d90: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
5da0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
5db0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
5dc0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5dd0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
5de0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
5df0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
5e00: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5e10: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
5e20: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29  pe, Pgno parent)
5e30: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
5e40: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
5e50: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
5e60: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
5e70: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
5e80: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
5e90: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
5ea0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
5eb0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
5ec0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
5ed0: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
5ee0: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
5ef0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
5f00: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5f20: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5f30: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
5f40: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
5f50: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
5f60: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
5f70: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
5f80: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
5f90: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
5fa0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
5fb0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
5fc0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
5fd0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
5fe0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72   key==0 ){.    r
5ff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6000: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6010: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6020: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6030: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6040: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6050: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6060: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6070: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
6090: 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
60a0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
60b0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
60c0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
60d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
60e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
60f0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6100: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74  _exit;.  }.  pPt
6110: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6120: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6130: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
6140: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
6150: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
6160: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6170: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
6180: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
6190: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
61a0: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
61b0: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
61c0: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
61d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
61e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
61f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6200: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6210: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6220: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6230: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6240: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6250: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6260: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6270: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6280: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
6290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
62a0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
62b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
62c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
62d0: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
62e0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
62f0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6300: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6310: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6320: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6330: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6340: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6350: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
6360: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6370: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
6380: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
6390: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
63a0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
63b0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
63c0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
63d0: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
63e0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
63f0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6400: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6410: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6420: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6430: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6440: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6450: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6460: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6470: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
6480: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
6490: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
64a0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
64b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
64c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
64d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
64e0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
64f0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6500: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6520: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6530: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6540: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6550: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6560: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6570: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6580: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6590: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
65a0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
65b0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
65c0: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
65d0: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
65e0: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
65f0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
6600: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
6610: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
6620: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
6630: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
6640: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
6650: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
6660: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
6670: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6680: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
6690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
66a0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69  #else /* if defi
66b0: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned SQLITE_OMIT_
66c0: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20  AUTOVACUUM */.  
66d0: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
66e0: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
66f0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
6700: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
6710: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
6720: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
6730: 76 66 6c 50 74 72 28 78 2c 20 79 29 20 53 51 4c  vflPtr(x, y) SQL
6740: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
6750: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72  *.** Given a btr
6760: 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65  ee page and a ce
6770: 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e  ll index (0 mean
6780: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
6790: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c   on.** the page,
67a0: 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63   1 means the sec
67b0: 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f  ond cell, and so
67c0: 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61   forth) return a
67d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
67e0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e  he cell content.
67f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6800: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
6810: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
6820: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
6830: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6840: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
6850: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
6860: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
6870: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
6880: 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50  e(&(P)->aData[(P
6890: 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  )->cellOffset+2*
68a0: 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (I)])))../*.** T
68b0: 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c  his a more compl
68c0: 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69  ex version of fi
68d0: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
68e0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
68f0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
6900: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6910: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66  .*/.static u8 *f
6920: 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
6930: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6940: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e  int iCell){.  in
6950: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t i;.  assert( s
6960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
6980: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  tex) );.  for(i=
6990: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
69a0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
69b0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73      int k;.    s
69c0: 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20  truct _OvflCell 
69d0: 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66  *pOvfl;.    pOvf
69e0: 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66  l = &pPage->aOvf
69f0: 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f  l[i];.    k = pO
6a00: 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66  vfl->idx;.    if
6a10: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
6a20: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
6a30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6a40: 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b  rn pOvfl->pCell;
6a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6a60: 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Cell--;.    }.  
6a70: 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  }.  return findC
6a80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
6a90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  );.}../*.** Pars
6aa0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
6ab0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
6ac0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
6ad0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72  structure.  Ther
6ae0: 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72  e.** are two ver
6af0: 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75  sions of this fu
6b00: 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50 61  nction.  btreePa
6b10: 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20  rseCell() takes 
6b20: 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78  a .** cell index
6b30: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
6b40: 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72 65  rgument and btre
6b50: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
6b60: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
6b70: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
6b80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
6b90: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
6ba0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
6bb0: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
6bc0: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
6bd0: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
6be0: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74  instead of.** bt
6bf0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6c00: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
6c10: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
6c20: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
6c30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
6c40: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
6c50: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
6c60: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
6c70: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
6c80: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
6c90: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
6ca0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
6cb0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
6cc0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
6cd0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
6ce0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
6cf0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
6d00: 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  16 n;           
6d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6d20: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
6d30: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
6d40: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
6d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6d60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6d70: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
6d80: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6d90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6da0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6db0: 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70  ) );..  pInfo->p
6dc0: 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
6dd0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
6de0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
6df0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20  >leaf==1 );.  n 
6e00: 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
6e10: 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  rSize;.  assert(
6e20: 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c   n==4-4*pPage->l
6e30: 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61  eaf );.  if( pPa
6e40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
6e50: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
6e60: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20  Data ){.      n 
6e70: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
6e80: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
6e90: 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ad);.    }else{.
6ea0: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
6eb0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   0;.    }.    n 
6ec0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
6ed0: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70  ell[n], (u64*)&p
6ee0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  Info->nKey);.   
6ef0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
6f00: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
6f10: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  e{.    pInfo->nD
6f20: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b  ata = 0;.    n +
6f30: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
6f40: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
6f50: 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  d);.    pInfo->n
6f60: 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  Key = nPayload;.
6f70: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
6f80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
6f90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
6fa0: 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61  er = n;.  testca
6fb0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
6fc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
6fd0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6fe0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
6ff0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
7000: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
7010: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
7020: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
7030: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
7040: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
7050: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
7060: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
7070: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
7080: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
7090: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
70a0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
70b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
70c0: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
70d0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
70e0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
70f0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
7100: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
7110: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
7120: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7130: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7140: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
7150: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
7160: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
7170: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
7180: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
7190: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
71a0: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
71b0: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
71c0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
71d0: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
71e0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
71f0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
7200: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
7210: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
7220: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
7230: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
7240: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
7250: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
7260: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
7270: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
7280: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
7290: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
72a0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
72b0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
72c0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
72d0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
72e0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
72f0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
7300: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
7310: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
7320: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
7330: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
7340: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
7350: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
7360: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
7370: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
7380: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
7390: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
73a0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
73b0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
73c0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
73d0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
73e0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
73f0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
7400: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
7410: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
7420: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
7430: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
7440: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
7450: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
7460: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
7470: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
7480: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
7490: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
74a0: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
74b0: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
74c0: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
74d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
74e0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
74f0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7500: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
7510: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7520: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  s==maxLocal+1 );
7530: 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73  .    if( surplus
7540: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
7550: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7560: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
7570: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
7580: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
7590: 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63  al = (u16)minLoc
75a0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
75b0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
75c0: 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c   (u16)(pInfo->nL
75d0: 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70  ocal + n);.    p
75e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
75f0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
7600: 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e   4;.  }.}.#defin
7610: 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67  e parseCell(pPag
7620: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7630: 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65 43   \.  btreeParseC
7640: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
7650: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
7660: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
7670: 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64  fo)).static void
7680: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7690: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
76a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
76b0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
76c0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
76d0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
76e0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
76f0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
7700: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
7710: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7720: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7730: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7740: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
7750: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7760: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
7770: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
7780: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
7790: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
77a0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
77b0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
77c0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
77d0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
77e0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
77f0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
7800: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
7810: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
7820: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
7830: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
7840: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
7850: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
7860: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
7870: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
7880: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7890: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
78a0: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
78b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
78c0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69    u32 nSize;..#i
78d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
78e0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
78f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7900: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7910: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
7920: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
7930: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
7940: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
7950: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
7960: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
7970: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
7980: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
7990: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
79a0: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
79b0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
79c0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
79d0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
79e0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
79f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
7a00: 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65  buginfo;.  btree
7a10: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
7a20: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
7a30: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
7a40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7a50: 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  Key ){.    u8 *p
7a60: 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61  End;.    if( pPa
7a70: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7a80: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
7a90: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c  tVarint32(pIter,
7aa0: 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c   nSize);.    }el
7ab0: 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20  se{.      nSize 
7ac0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
7ad0: 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69  /* pIter now poi
7ae0: 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69  nts at the 64-bi
7af0: 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61  t integer key va
7b00: 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20  lue, a variable 
7b10: 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69  length .    ** i
7b20: 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c  nteger. The foll
7b30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65  owing block move
7b40: 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  s pIter to point
7b50: 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79   at the first by
7b60: 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  te.    ** past t
7b70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65  he end of the ke
7b80: 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20  y value. */.    
7b90: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d  pEnd = &pIter[9]
7ba0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70  ;.    while( (*p
7bb0: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
7bc0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
7bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
7be0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7bf0: 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20  pIter, nSize);. 
7c00: 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20   }..  testcase( 
7c10: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7c20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
7c30: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7c40: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
7c50: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50  ;.  if( nSize>pP
7c60: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7c70: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
7c80: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7c90: 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  cal;.    nSize =
7ca0: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69   minLocal + (nSi
7cb0: 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25  ze - minLocal) %
7cc0: 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73   (pPage->pBt->us
7cd0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
7ce0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69     testcase( nSi
7cf0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7d00: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7d10: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7d20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7d30: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  .    if( nSize>p
7d40: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7d50: 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20  {.      nSize = 
7d60: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
7d70: 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a      nSize += 4;.
7d80: 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28    }.  nSize += (
7d90: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
7da0: 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  ll);..  /* The m
7db0: 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  inimum size of a
7dc0: 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74  ny cell is 4 byt
7dd0: 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69  es. */.  if( nSi
7de0: 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a  ze<4 ){.    nSiz
7df0: 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73  e = 4;.  }..  as
7e00: 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62  sert( nSize==deb
7e10: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  uginfo.nSize );.
7e20: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
7e30: 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e  ize;.}.#ifndef N
7e40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36  DEBUG.static u16
7e50: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
7e60: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
7e70: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
7e80: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
7e90: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
7ea0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
7eb0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
7ec0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7ed0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
7ee0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
7ef0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
7f00: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
7f10: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
7f20: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
7f30: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
7f40: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
7f50: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
7f60: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
7f70: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
7f80: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
7f90: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
7fa0: 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  ll){.  CellInfo 
7fb0: 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20  info;.  assert( 
7fc0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
7fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fe0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
7ff0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
8000: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
8010: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
8020: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8030: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8040: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8050: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8060: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8070: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8080: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
8090: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
80a0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
80b0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
80c0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
80d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
80e0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  OK;.}.#endif.../
80f0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8100: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
8110: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
8120: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
8130: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8140: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8150: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8160: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8170: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8180: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8190: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
81a0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
81b0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
81c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
81d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
81e0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
81f0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8200: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8220: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
8230: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8240: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8250: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8260: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8290: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
82a0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82c0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
82d0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
82e0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
82f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8300: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
8310: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
8320: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
8330: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8340: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8350: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8360: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8380: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8390: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
83a0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
83b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83c0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
83d0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
83e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
83f0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8400: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
8410: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8420: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
8430: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8440: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8450: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8470: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8480: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8490: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
84b0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
84c0: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
84d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
84e0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
84f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8510: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8520: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8530: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8540: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8550: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8560: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8570: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8580: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8590: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
85a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
85b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
85c0: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
85d0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
85e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
85f0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8600: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8610: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8620: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8630: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8640: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8650: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8660: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8670: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8680: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8690: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
86a0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
86b0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
86c0: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
86d0: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
86e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
86f0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8700: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8710: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8720: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8730: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8740: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8750: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8760: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8770: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8780: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8790: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
87a0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
87b0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
87c0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
87d0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
87e0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
87f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8800: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8810: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8820: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8830: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8840: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8850: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8860: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8870: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8880: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
88a0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
88b0: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
88c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
88d0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
88e0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
88f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8900: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8920: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8930: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8940: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8950: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8960: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8970: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8980: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
89a0: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
89b0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
89c0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
89d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
89e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
89f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8a00: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8a10: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8a20: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8a30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8a40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8a50: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8a60: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8a70: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8a80: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8a90: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8aa0: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8ab0: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8ac0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8ad0: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8ae0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8af0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8b00: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8b10: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8b20: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8b30: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8b40: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8b50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8b60: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8b70: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8b80: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8b90: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8ba0: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8bb0: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8bc0: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8bd0: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8be0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8bf0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8c00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8c10: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8c20: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8c30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8c40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8c50: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8c60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8c70: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8c80: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8c90: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8ca0: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8cb0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8cc0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8cd0: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8ce0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8cf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8d00: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8d10: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8d20: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8d30: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8d40: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8d50: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8d60: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
8d70: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
8d80: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
8d90: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
8da0: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
8db0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
8dc0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
8dd0: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
8de0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
8df0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
8e00: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
8e10: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
8e20: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
8e30: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
8e40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
8e50: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
8e60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
8e70: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
8e80: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
8e90: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
8ea0: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
8eb0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
8ec0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
8ed0: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
8ee0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
8ef0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
8f00: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
8f10: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
8f20: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
8f30: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
8f40: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
8f50: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
8f60: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
8f70: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
8f80: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
8f90: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
8fa0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
8fb0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
8fc0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
8fd0: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9000: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
9010: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
9020: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9050: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9060: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9070: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9080: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9090: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
90a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
90b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
90c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
90d0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
90e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a  turn code */.  .
90f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9100: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9110: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9130: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9140: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9150: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9160: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9170: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9180: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9190: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
91a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
91b0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
91c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
91d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
91e0: 3d 30 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  =0 );..  nFrag =
91f0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
9200: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
9210: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9220: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9230: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9240: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9250: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9260: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9270: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9280: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
9290: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
92a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
92b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
92c0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
92d0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
92e0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
92f0: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9300: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9310: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9320: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9330: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9340: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9350: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
9360: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
9370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
9380: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
9390: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
93a0: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
93b0: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
93c0: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
93d0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
93e0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
93f0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
9400: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
9410: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
9420: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
9430: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
9440: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9450: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9460: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9470: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9480: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9490: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
94a0: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
94b0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
94c0: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
94d0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
94e0: 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
94f0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9500: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9510: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
9520: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
9530: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
9540: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
9550: 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  te;.        test
9560: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
9570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9580: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  x==3 );.        
9590: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
95a0: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
95b0: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
95c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
95d0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
95e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
95f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
9600: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
9610: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
9620: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
9630: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
9640: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
9650: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
9660: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
9670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9680: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
9690: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
96a0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
96b0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
96c0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
96d0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
96e0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
96f0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
9700: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
9710: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
9720: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9730: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
9740: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
9750: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9770: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
9780: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  make sure there 
9790: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
97a0: 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61  in the gap to sa
97b0: 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61  tisfy.  ** the a
97c0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e  llocation.  If n
97d0: 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a  ot, defragment..
97e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
97f0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
9800: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
9810: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
9820: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9830: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9840: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9850: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9860: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
9870: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
9880: 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74  rt( gap+nByte<=t
9890: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
98a0: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
98b0: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
98c0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
98d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
98e0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
98f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
9900: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
9910: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
9920: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
9930: 70 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f  p);.  *pIdx = to
9940: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
9950: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
9960: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
9970: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
9980: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
9990: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
99a0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
99b0: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
99c0: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
99d0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
99e0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
99f0: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
9a00: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
9a10: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
9a20: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
9a30: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
9a40: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
9a50: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
9a60: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
9a70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
9a80: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
9a90: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
9aa0: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
9ab0: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
9ac0: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
9ad0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9ae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
9af0: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
9b00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
9b10: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9b20: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
9b30: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
9b40: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
9b50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
9b60: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
9b70: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
9b80: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
9b90: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
9ba0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
9bb0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
9bd0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
9be0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9bf0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
9c00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9c10: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9c20: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9c30: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
9c40: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9c50: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
9c60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
9c70: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
9c80: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
9c90: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
9ca0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
9cb0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
9cc0: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
9cd0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
9ce0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
9cf0: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
9d00: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
9d10: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
9d20: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
9d30: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9d40: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   of freeblocks. 
9d50: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20   Note that.  ** 
9d60: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
9d70: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
9d80: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
9d90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20  reeInitPage(),. 
9da0: 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
9db0: 65 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65  e() did not dete
9dc0: 63 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63  ct overlapping c
9dd0: 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65  ells or.  ** fre
9de0: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65  eblocks that ove
9df0: 72 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20  rlapped cells.  
9e00: 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74   Nor does it det
9e10: 65 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ect when the.  *
9e20: 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  * cell content a
9e30: 72 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20  rea exceeds the 
9e40: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67  value in the pag
9e50: 65 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68  e header.  If th
9e60: 65 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69  ese.  ** situati
9e70: 6f 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20  ons arise, then 
9e80: 73 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72  subsequent inser
9e90: 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67  t operations mig
9ea0: 68 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20  ht corrupt.  ** 
9eb0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53  the freelist.  S
9ec0: 6f 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20  o we do need to 
9ed0: 63 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70  check for corrup
9ee0: 74 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e  tion while scann
9ef0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  ing.  ** the fre
9f00: 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64  elist..  */.  hd
9f10: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
9f20: 66 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68  fset;.  addr = h
9f30: 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20  dr + 1;.  iLast 
9f40: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
9f50: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
9f60: 61 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69  assert( start<=i
9f70: 4c 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28  Last );.  while(
9f80: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
9f90: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9fa0: 29 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69  )<start && pbegi
9fb0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  n>0 ){.    if( p
9fc0: 62 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a  begin<addr+4 ){.
9fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9fe0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72  ;.    }.    addr
a000: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20   = pbegin;.  }. 
a010: 20 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73   if( pbegin>iLas
a020: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
a030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a040: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
a050: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c  t( pbegin>addr |
a060: 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20  | pbegin==0 );. 
a070: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a080: 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20  addr], start);. 
a090: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a0a0: 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b  start], pbegin);
a0b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a0c0: 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65  a[start+2], size
a0d0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
a0e0: 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  e = pPage->nFree
a0f0: 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20   + (u16)size;.. 
a100: 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a   /* Coalesce adj
a110: 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b  acent free block
a120: 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64  s */.  addr = hd
a130: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
a140: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a150: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a160: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e  >0 ){.    int pn
a170: 65 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20  ext, psize, x;. 
a180: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
a190: 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73  n>addr );.    as
a1a0: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
a1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a1c0: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
a1d0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
a1e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
a1f0: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
a200: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
a210: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
a220: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
a230: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
a240: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
a250: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
a260: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
a270: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
a280: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
a290: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
a2a0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
a2b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a2c0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
a2d0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
a2e0: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
a2f0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
a300: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
a310: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a320: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
a330: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
a340: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
a350: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
a360: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
a370: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
a380: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
a390: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
a3a0: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
a3b0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
a3c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a3d0: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
a3e0: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
a3f0: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
a400: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
a410: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
a420: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
a430: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
a440: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
a450: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a460: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
a470: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
a480: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
a490: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
a4a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a4b0: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
a4c0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
a4d0: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
a4e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
a4f0: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
a500: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a510: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a520: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
a550: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
a560: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
a570: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
a580: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
a590: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
a5a0: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
a5b0: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
a5c0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
a5d0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
a5e0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
a5f0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
a600: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
a610: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
a620: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
a630: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
a640: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
a650: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
a660: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
a670: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
a680: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
a690: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
a6a0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
a6b0: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
a6c0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
a6d0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
a6e0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
a6f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
a700: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
a710: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
a720: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
a730: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
a740: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a750: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
a760: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
a770: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a780: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
a790: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
a7a0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
a7b0: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
a7c0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
a7d0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
a7e0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
a7f0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
a800: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a810: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
a820: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
a830: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
a840: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
a850: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
a860: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
a870: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
a880: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
a890: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
a8a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
a8b0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
a8c0: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
a8d0: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
a8e0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
a8f0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
a900: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
a910: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
a920: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
a930: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
a940: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
a950: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
a960: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
a970: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
a980: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
a990: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a9a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a9b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
a9e0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
a9f0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
aa00: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
aa10: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
aa20: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
aa30: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
aa40: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
aa50: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
aa60: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
aa70: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
aa80: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
aa90: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
aaa0: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
aab0: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
aac0: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
aad0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
aae0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
aaf0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
ab00: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
ab10: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
ab20: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
ab30: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
ab40: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ab50: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
ab60: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ab70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ab80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ab90: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
aba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
abb0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
abc0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
abd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
abe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
abf0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ac00: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ac10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ac20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ac30: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
ac40: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ac50: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ac60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
ac70: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
ac80: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
ac90: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
aca0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
acb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
acc0: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ace0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
acf0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
ad00: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
ad10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
ad20: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ad30: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ad40: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ad50: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ad60: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ad70: 20 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a     u16 usableSiz
ad80: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ad90: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ada0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
adb0: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
adc0: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
add0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ade0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
adf0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ae00: 20 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20   u16 nFree;     
ae10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae20: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ae30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ae40: 20 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20   u16 top;       
ae50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae60: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ae70: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ae80: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ae90: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
aea0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
aeb0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
aec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
aed0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
aee0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
aef0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
af00: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
af10: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
af20: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
af30: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
af40: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
af50: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
af60: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
af70: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
af80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
afa0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
afb0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
afc0: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
afd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
afe0: 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61  skPage = pBt->pa
aff0: 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20  geSize - 1;.    
b000: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b010: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
b020: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
b030: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
b040: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
b050: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
b060: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
b070: 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d  >leaf;.    top =
b080: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b090: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b0a0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b0b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b0c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b0d0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b0e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b0f0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b100: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b110: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
b120: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
b130: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b140: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b150: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
b160: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
b170: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
b180: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
b190: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
b1a0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
b1b0: 65 20 75 73 65 20 74 6f 20 72 65 61 64 20 70 61  e use to read pa
b1c0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
b1d0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
b1e0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
b1f0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
b200: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
b210: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
b220: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
b230: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
b240: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
b250: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
b260: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
b270: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
b280: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
b290: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
b2a0: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
b2b0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
b2c0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
b2d0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
b2e0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
b2f0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
b300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b310: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
b320: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
b330: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
b340: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
b350: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
b360: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
b370: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
b380: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b390: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
b3a0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
b3b0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
b3c0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
b3d0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
b3e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b3f0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
b400: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
b410: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
b420: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
b430: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
b440: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b450: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b460: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
b470: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b480: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b490: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b4b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4c0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
b4d0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
b4e0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
b4f0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
b500: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b510: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
b520: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b530: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b540: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b550: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
b560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
b570: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
b580: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
b590: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
b5a0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
b5b0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
b5c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b5d0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b5e0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
b5f0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
b600: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
b610: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
b620: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
b630: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
b640: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b650: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b660: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
b670: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
b680: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
b690: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b6a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
b6b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
b6c0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b6d0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b6e0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
b6f0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
b700: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
b710: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
b720: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
b730: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
b740: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
b750: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
b760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b770: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
b780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
b790: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
b7a0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
b7b0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
b7c0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
b7d0: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
b7e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
b7f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b800: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
b810: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
b820: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
b830: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
b840: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
b850: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
b860: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
b870: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
b880: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
b890: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
b8a0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
b8b0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
b8c0: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
b8d0: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
b8e0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
b8f0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
b900: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
b910: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
b920: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
b930: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
b940: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
b950: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
b960: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
b970: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b990: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b9a0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
b9b0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
b9c0: 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 3b 0a  e - iCellFirst;.
b9d0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
b9e0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
b9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ba00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
ba10: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
ba20: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
ba30: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
ba40: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
ba50: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
ba60: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
ba70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ba80: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
ba90: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
baa0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
bab0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bac0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
bad0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
bae0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
baf0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
bb00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
bb10: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
bb20: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
bb30: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
bb40: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
bb50: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
bb60: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
bb70: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
bb80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bb90: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
bba0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
bbb0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
bbc0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
bbd0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
bbe0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
bbf0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bc00: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
bc10: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
bc20: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
bc30: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
bc40: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
bc50: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
bc60: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
bc70: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
bc80: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
bc90: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
bca0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
bcb0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
bcc0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
bcd0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
bce0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
bcf0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
bd00: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
bd10: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
bd20: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
bd30: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
bd40: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
bd50: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
bd60: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
bd70: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
bd80: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
bd90: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
bda0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
bdb0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
bdc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
bdd0: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
bde0: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
bdf0: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
be00: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
be10: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
be20: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
be30: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
be40: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
be50: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
be60: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
be70: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
be80: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
be90: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
bea0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
beb0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
bec0: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
bed0: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
bee0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
bef0: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
bf00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
bf10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
bf20: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
bf30: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
bf40: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
bf50: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
bf60: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
bf70: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
bf80: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
bf90: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
bfa0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
bfb0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
bfc0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
bfd0: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
bfe0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
bff0: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
c000: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
c010: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
c020: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
c030: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
c040: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
c050: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
c060: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
c070: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
c080: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
c090: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
c0a0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
c0b0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
c0c0: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
c0d0: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
c0e0: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
c0f0: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
c100: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
c110: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
c120: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
c130: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
c140: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
c150: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
c160: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
c170: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
c180: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
c190: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
c1a0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
c1b0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
c1c0: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
c1d0: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
c1e0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c1f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c200: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
c210: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
c220: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
c230: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
c240: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
c250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
c260: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
c270: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
c280: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
c290: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
c2a0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
c2b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c2c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c2d0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c2e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
c2f0: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
c300: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
c310: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
c320: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
c330: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
c340: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
c350: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
c360: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
c370: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
c380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c390: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
c3a0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
c3b0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
c3c0: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
c3d0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
c3e0: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
c3f0: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
c400: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
c410: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
c420: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
c430: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
c440: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c450: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c460: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
c470: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
c480: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
c490: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
c4a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c4b0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c4c0: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
c4d0: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
c4e0: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
c4f0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
c500: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
c510: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
c520: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c530: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
c540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c550: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c560: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
c570: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
c580: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
c590: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
c5a0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
c5b0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
c5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
c5d0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
c5e0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
c5f0: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
c600: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
c610: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
c620: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
c630: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
c640: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
c650: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
c660: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
c670: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
c680: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
c690: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
c6a0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c6b0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
c6c0: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
c6d0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
c6e0: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
c6f0: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
c700: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
c710: 74 6f 0a 2a 2a 20 62 74 72 65 65 47 65 74 50 61  to.** btreeGetPa
c720: 67 65 28 29 20 61 6e 64 20 62 74 72 65 65 49 6e  ge() and btreeIn
c730: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
c740: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
c750: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
c760: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
c770: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c780: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
c790: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
c7a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
c7b0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
c7c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
c7d0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
c7e0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
c7f0: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
c800: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
c810: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
c820: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c830: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
c840: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
c850: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c870: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
c880: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
c890: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
c8a0: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
c8b0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
c8c0: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
c8d0: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
c8e0: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
c8f0: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
c900: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
c910: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
c920: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
c930: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
c940: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
c950: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
c960: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
c970: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
c980: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
c990: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
c9a0: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
c9b0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
c9c0: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
c9d0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
c9e0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
c9f0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
ca00: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
ca10: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
ca20: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 74 65 73 74   it. */.    test
ca30: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 70 61 67 65  case( pgno==page
ca40: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
ca50: 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
ca60: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
ca70: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Bt) ){.      ret
ca80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca90: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
caa0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
cab0: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
cac0: 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20   ppPage, 0);.   
cad0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cae0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d   rc;.    pPage =
caf0: 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20   *ppPage;.  }.  
cb00: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
cb10: 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  it ){.    rc = b
cb20: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
cb30: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
cb40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cb50: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
cb60: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
cb70: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
cb80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cb90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
cba0: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
cbb0: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
cbc0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
cbd0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
cbe0: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
cbf0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
cc00: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
cc10: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
cc20: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
cc30: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cc40: 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  w==0 || sqlite3P
cc50: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
cc60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cc70: 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >1 );.    assert
cc80: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
cc90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
cca0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
ccb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ccc0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
ccd0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
cce0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
ccf0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
cd00: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
cd10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
cd20: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
cd30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cd40: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cd50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cd60: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
cd70: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
cd80: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
cd90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  .}../*.** During
cda0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
cdb0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
cdc0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
cdd0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
cde0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
cdf0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
ce00: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
ce10: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
ce20: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
ce30: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
ce40: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
ce50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ce60: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
ce70: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
ce80: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
ce90: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
cea0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
ceb0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
cec0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
ced0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
cee0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
cef0: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
cf00: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
cf10: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
cf20: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
cf30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cf40: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
cf50: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
cf60: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
cf70: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
cf80: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
cf90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
cfa0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cfb0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
cfc0: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
cfd0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
cfe0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
cff0: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
d000: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
d010: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
d020: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
d030: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
d040: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
d050: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
d060: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
d070: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
d080: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
d090: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
d0a0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
d0b0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
d0c0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
d0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
d0e0: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
d0f0: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
d100: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
d110: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
d120: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
d130: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
d140: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
d150: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
d160: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
d170: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
d180: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
d190: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
d1a0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
d1b0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
d1c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
d1d0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
d1e0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
d1f0: 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
d200: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
d210: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
d220: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
d230: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
d240: 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
d250: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
d260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d270: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d280: 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
d290: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
d2a0: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
d2b0: 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
d2c0: 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
d2d0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
d2e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
d2f0: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
d300: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d310: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d320: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
d330: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
d340: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
d350: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
d360: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
d370: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
d380: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
d390: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
d3a0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
d3b0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
d3c0: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
d3d0: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
d3e0: 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  hen an in-memory
d3f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
d400: 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20  ated.** that is 
d410: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
d420: 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20  stroyed when it 
d430: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
d440: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d450: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
d460: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
d470: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d480: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
d490: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
d4a0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
d4b0: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
d4c0: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
d4d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
d4e0: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
d4f0: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
d500: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
d510: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
d520: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d530: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
d540: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
d550: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
d560: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
d570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
d580: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
d590: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
d5a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
d5b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d5c0: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
d5d0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d5f0: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
d600: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
d610: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
d620: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d630: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
d640: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
d650: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
d660: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
d670: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
d680: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
d690: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
d6a0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
d6b0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
d6c0: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
d6d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d6f0: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
d700: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
d710: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
d720: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
d730: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
d740: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
d750: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
d760: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
d770: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
d780: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
d790: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
d7a0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
d7b0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
d7c0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
d7d0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
d7e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d7f0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d800: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
d810: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
d820: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
d830: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
d840: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
d850: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
d860: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
d870: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
d880: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
d890: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
d8a0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
d8b0: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
d8c0: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
d8d0: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
d8e0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
d8f0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
d900: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
d910: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
d920: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
d930: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
d940: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
d950: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
d960: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
d970: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
d980: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
d990: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
d9a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9b0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d9c0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
d9d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d9e0: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
d9f0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
da00: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
da10: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
da20: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
da30: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
da40: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
da50: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
da60: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
da70: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
da80: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
da90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
daa0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
dab0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
dac0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
dad0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
dae0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
daf0: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
db00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
db10: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
db20: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
db30: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
db40: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
db50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
db60: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
db70: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
db80: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
db90: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
dba0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dbb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
dbc0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
dbd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
dbe0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
dbf0: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
dc00: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
dc10: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
dc20: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
dc30: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
dc40: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
dc50: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
dc60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
dc70: 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61  db==0 && zFilena
dc80: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
dc90: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  0] ){.    if( sq
dca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
dcb0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
dcc0: 62 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  bled ){.      in
dcd0: 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  t nFullPathname 
dce0: 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
dcf0: 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72  me+1;.      char
dd00: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
dd10: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
dd20: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  nFullPathname);.
dd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dd40: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
dd50: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ;.      p->shara
dd60: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64  ble = 1;.      d
dd70: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
dd80: 54 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a  TE_SharedCache;.
dd90: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
dda0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ddb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ddc0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
ddd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dde0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ddf0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
de00: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
de10: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
de20: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
de30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
de40: 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
de50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
de60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
de70: 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
de80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
de90: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
dea0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
deb0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
dec0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ded0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
dee0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
def0: 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
df00: 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  red);.      for(
df10: 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61  pBt=GLOBAL(BtSha
df20: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
df30: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42  edCacheList); pB
df40: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
df50: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
df60: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
df70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
df80: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
df90: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
dfa0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
dfb0: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
dfd0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
dfe0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
dff0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
e000: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
e010: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
e020: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
e030: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
e040: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
e050: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
e060: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
e070: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
e080: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
e090: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
e0a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e0d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e0e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e0f0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
e100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
e110: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e120: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
e130: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e160: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e180: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
e190: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
e1a0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
e1b0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
e1c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
e1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
e1e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e1f0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
e210: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e220: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
e230: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
e240: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
e250: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
e260: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
e270: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
e280: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
e290: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
e2a0: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
e2b0: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
e2c0: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
e2d0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
e2e0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
e2f0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
e300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
e310: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
e320: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
e330: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
e340: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
e350: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
e360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e370: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
e380: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
e390: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
e3a0: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
e3b0: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
e3c0: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
e3d0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
e3e0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
e3f0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
e400: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
e410: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
e420: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
e430: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
e440: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
e450: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
e460: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e470: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
e480: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
e490: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4a0: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
e4b0: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
e4c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
e4d0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
e4e0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
e4f0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
e500: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
e510: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
e520: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
e530: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
e540: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
e550: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
e560: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e570: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e580: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
e590: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
e5a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
e5b0: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
e5c0: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
e5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5e0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
e5f0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
e600: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
e610: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e620: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e630: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
e640: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
e650: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
e660: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
e670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e690: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
e6a0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
e6b0: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
e6c0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
e6d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
e6e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
e6f0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
e700: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
e710: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
e720: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
e730: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
e740: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
e750: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
e760: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
e770: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
e780: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
e790: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
e7a0: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
e7b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
e7c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e7d0: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
e7e0: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
e7f0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
e800: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
e810: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
e820: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
e830: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
e840: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
e850: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
e860: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e870: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
e880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e890: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
e8a0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
e8b0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
e8c0: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
e8d0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
e8e0: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
e8f0: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
e900: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
e910: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
e920: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
e930: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
e940: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
e950: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
e960: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
e970: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
e980: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
e990: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
e9a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
e9b0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
e9c0: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
e9d0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
e9e0: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
e9f0: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
ea00: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
ea10: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
ea20: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
ea30: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
ea40: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
ea50: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
ea60: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
ea70: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
ea80: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
ea90: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
eaa0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
eab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
eac0: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
ead0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
eae0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
eaf0: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
eb00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
eb10: 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23  SizeFixed = 1;.#
eb20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
eb30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
eb40: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
eb50: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
eb60: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
eb70: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
eb80: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
eb90: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
eba0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
ebb0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
ebc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ebd0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
ebe0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
ebf0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
ec00: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
ec10: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
ec20: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
ec30: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
ec40: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
ec50: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
ec60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
ec70: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
ec80: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
ec90: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
eca0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
ecb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ecc0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ecd0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ece0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ecf0: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
ed00: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
ed10: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
ed20: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
ed30: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
ed40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ed50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ed70: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
ed80: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
ed90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65   = 1;.      mute
eda0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
edb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
edc0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
edd0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69  MASTER);.      i
ede0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
edf0: 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47  SAFE && sqlite3G
ee00: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
ee10: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
ee20: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
ee30: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
ee40: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
ee50: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
ee60: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
ee70: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
ee80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ee90: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
eea0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
eeb0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
eec0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
eed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
eef0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ef00: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
ef10: 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
ef20: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef30: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef40: 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
ef50: 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
ef60: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
ef70: 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
ef80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ef90: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
efa0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
efb0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
efc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
efd0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
efe0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eff0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
f000: 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
f010: 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
f020: 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
f030: 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
f040: 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
f050: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
f060: 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
f070: 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
f080: 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
f090: 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
f0a0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
f0b0: 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
f0c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
f0d0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
f0e0: 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
f0f0: 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
f100: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
f110: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
f120: 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
f130: 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
f140: 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
f150: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
f160: 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
f170: 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
f180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
f190: 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20  ->pBt<pSib->pBt 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
f1b0: 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
f1c0: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
f1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f1e0: 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
f1f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f200: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
f210: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
f220: 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
f230: 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  <p->pBt ){.     
f240: 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53         pSib = pS
f250: 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
f260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f270: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
f280: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
f290: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53     p->pPrev = pS
f2a0: 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ib;.          if
f2b0: 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
f2c0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
f2d0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  xt->pPrev = p;. 
f2e0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f2f0: 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74       pSib->pNext
f300: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = p;.        }.
f310: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f330: 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72  .#endif.  *ppBtr
f340: 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f  ee = p;..btree_o
f350: 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  pen_out:.  if( r
f360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f370: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70      if( pBt && p
f380: 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  Bt->pPager ){.  
f390: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f3a0: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f3b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
f3c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
f3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
f3e0: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
f3f0: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ee = 0;.  }.  if
f400: 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
f410: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f420: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
f430: 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
f440: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f450: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
f460: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
f480: 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
f490: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
f4a0: 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
f4b0: 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
f4c0: 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
f4d0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
f4e0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
f4f0: 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
f500: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
f510: 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
f520: 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
f530: 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
f540: 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
f550: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
f560: 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
f570: 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
f580: 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
f590: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f5a0: 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69  RED_CACHE.  sqli
f5b0: 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
f5c0: 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  er;.  BtShared *
f5d0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
f5e0: 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
f5f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f600: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
f610: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73  mutex) );.  pMas
f620: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
f630: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f640: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f650: 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ER);.  sqlite3_m
f660: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
f670: 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66  er);.  pBt->nRef
f680: 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  --;.  if( pBt->n
f690: 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  Ref<=0 ){.    if
f6a0: 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  ( GLOBAL(BtShare
f6b0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
f6c0: 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20  CacheList)==pBt 
f6d0: 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  ){.      GLOBAL(
f6e0: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f6f0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f700: 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  ) = pBt->pNext;.
f710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f720: 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28   pList = GLOBAL(
f730: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
f740: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
f750: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f760: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26  ALWAYS(pList) &&
f770: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70   pList->pNext!=p
f780: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  Bt ){.        pL
f790: 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74  ist=pList->pNext
f7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f7b0: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
f7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  ) ){.        pLi
f7d0: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  st->pNext = pBt-
f7e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
f7f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
f800: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
f810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f820: 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d  _mutex_free(pBt-
f830: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20  >mutex);.    }. 
f840: 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a     removed = 1;.
f850: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f860: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
f870: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d  r);.  return rem
f880: 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65  oved;.#else.  re
f890: 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d  turn 1;.#endif.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
f8b0: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f8c0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c   points to an al
f8d0: 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20  location of .** 
f8e0: 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
f8f0: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
f900: 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
f910: 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
f920: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
f930: 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
f940: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
f950: 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
f960: 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
f970: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  pageSize );.  }.
f980: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
f990: 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
f9a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
f9b0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
f9c0: 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
f9d0: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
f9e0: 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74 2d  e3PageFree( pBt-
f9f0: 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70  >pTmpSpace);.  p
fa00: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
fa10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
fa20: 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61  e an open databa
fa30: 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  se and invalidat
fa40: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
fa50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fa60: 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70  eeClose(Btree *p
fa70: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
fa80: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
fa90: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  tCursor *pCur;..
faa0: 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63    /* Close all c
fab0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69  ursors opened vi
fac0: 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20  a this handle.  
fad0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
fae0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
faf0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
fb00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
fb10: 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20  nter(p);.  pCur 
fb20: 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
fb30: 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b    while( pCur ){
fb40: 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70  .    BtCursor *p
fb50: 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20  Tmp = pCur;.    
fb60: 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  pCur = pCur->pNe
fb70: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70  xt;.    if( pTmp
fb80: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
fb90: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fba0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d  eCloseCursor(pTm
fbb0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
fbc0: 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79   /* Rollback any
fbd0: 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
fbe0: 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65  ion and free the
fbf0: 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72   handle structur
fc00: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  e..  ** The call
fc10: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
fc20: 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73  Rollback() drops
fc30: 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73   any table-locks
fc40: 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68   held by.  ** th
fc50: 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a  is handle..  */.
fc60: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
fc70: 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c  llback(p);.  sql
fc80: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
fc90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
fca0: 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
fcb0: 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
fcc0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
fcd0: 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
fce0: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
fcf0: 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
fd00: 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
fd10: 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
fd20: 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
fd30: 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
fd40: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
fd50: 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
fd60: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
fd70: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
fd80: 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
fd90: 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
fda0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
fdb0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
fdc0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
fdd0: 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
fde0: 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
fdf0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
fe00: 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
fe10: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
fe20: 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
fe30: 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
fe40: 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
fe50: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
fe60: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
fe70: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fe80: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
fe90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
fea0: 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
feb0: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
fec0: 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
fed0: 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
fee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fef0: 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53  te3_free(pBt->pS
ff00: 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
ff10: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
ff20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff30: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
ff40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff50: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
ff60: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
ff70: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
ff80: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
ff90: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
ffa0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
ffb0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
ffc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
ffd0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
ffe0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
fff0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10000 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10010 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10020 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10030 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
10040 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
10050 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
10060 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
10070 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10080 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
10090 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
100a0 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
100b0 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
100c0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
100d0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
100e0 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
100f0 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10100 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10110 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10120 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
10130 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
10140 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
10150 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
10160 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
10170 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
10180 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10190 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
101a0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
101b0 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
101c0 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
101d0 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
101e0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
101f0 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
10200 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
10210 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
10220 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
10230 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
10240 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
10250 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
10260 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
10270 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
10280 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
10290 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
102a0 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
102b0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
102c0 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
102d0 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
102e0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
102f0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
10300 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
10310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10320 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
10330 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10340 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10350 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
10360 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10370 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10380 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
10390 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
103a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
103b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
103c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
103d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
103e0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
103f0 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
10400 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
10410 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
10420 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
10430 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
10440 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
10450 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
10460 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
10470 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
10480 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
10490 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
104a0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
104b0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
104c0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
104d0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
104e0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
104f0 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
10500 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
10510 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10520 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
10530 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
10540 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
10550 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
10560 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
10570 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
10580 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
10590 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
105a0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
105b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
105c0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
105d0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
105e0 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
105f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10600 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10610 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10620 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10630 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10640 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10650 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10660 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
10670 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
10680 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
10690 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
106a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
106b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
106c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
106d0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
106e0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
106f0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
10700 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
10710 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
10720 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
10730 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
10740 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
10750 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
10760 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
10770 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
10780 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10790 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
107a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
107c0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
107d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
107e0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
107f0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
10800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10810 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
10820 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
10830 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10850 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10860 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10870 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
10880 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10890 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
108a0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
108b0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
108c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
108d0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
108e0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
108f0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
10900 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10910 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
10920 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
10930 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
10940 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
10950 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
10960 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
10970 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
10980 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
10990 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
109a0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
109b0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
109c0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
109d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
109e0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
109f0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
10a00 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
10a10 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
10a20 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
10a30 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
10a40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10a50 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
10a60 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
10a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
10a80 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
10a90 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
10aa0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
10ab0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
10ac0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
10ad0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
10ae0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
10af0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
10b00 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
10b10 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
10b20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
10b30 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
10b40 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
10b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
10b60 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
10b70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
10b80 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
10b90 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
10ba0 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
10bb0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
10bc0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
10bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10be0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
10bf0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
10c00 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
10c10 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
10c20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10c30 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
10c40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
10c50 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
10c60 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
10c70 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
10c80 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10c90 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
10ca0 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
10cb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
10cc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
10ce0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
10cf0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
10d00 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
10d10 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
10d20 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
10d30 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
10d40 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
10d50 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
10d60 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
10d70 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
10d80 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
10d90 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
10da0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
10db0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
10dc0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
10dd0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
10de0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
10df0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
10e00 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
10e10 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
10e20 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
10e30 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10e40 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
10e50 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10e60 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
10e70 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
10e80 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
10e90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10ea0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
10eb0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
10ec0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
10ed0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
10ee0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
10ef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10f10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
10f20 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
10f30 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
10f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
10f50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10f60 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
10f70 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
10f80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
10fa0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
10fb0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
10fc0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
10fd0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
10fe0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
10ff0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11000 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11010 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11020 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11040 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11050 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11060 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11070 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11080 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11090 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
110a0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
110b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
110c0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
110d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
110e0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
110f0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11100 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11110 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11120 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11130 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11140 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11150 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11160 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11170 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11180 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11190 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
111a0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
111b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
111c0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
111d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
111e0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
111f0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11200 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11210 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11220 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11230 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11240 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  n;.}.#endif /* !
11250 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11260 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11270 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
11280 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
11290 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  M) */../*.** Cha
112a0 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
112b0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
112c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
112d0 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
112e0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
112f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
11300 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
11310 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
11320 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
11330 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
11340 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
11350 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
11360 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
11370 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
11380 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
11390 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
113a0 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
113b0 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
113c0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
113d0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
113e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
113f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
11410 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
11420 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11430 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
11440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11450 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
11460 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
11470 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11480 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
11490 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61  eSizeFixed && (a
114a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
114b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
114c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
114d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
114e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
114f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
11500 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11510 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
11520 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11530 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11540 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
11550 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11560 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11570 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11580 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
11590 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
115a0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
115b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
115c0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
115d0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
115e0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
115f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11600 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
11610 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
11620 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
11630 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
11640 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11650 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
11660 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
11670 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
11680 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
11690 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
116a0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
116b0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
116c0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
116d0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
116e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
116f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11700 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11710 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
11720 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
11730 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11740 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
11750 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
11760 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
11770 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
11780 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11790 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
117a0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
117b0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
117c0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
117d0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
117e0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
117f0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
11800 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
11810 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
11820 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
11830 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
11840 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
11850 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
11860 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
11870 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
11880 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
11890 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
118a0 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
118b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
118c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
118d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
118e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
118f0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
11900 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
11910 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
11920 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
11930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
11940 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
11950 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
11960 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
11970 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
11980 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
11990 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
119a0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
119b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
119c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
119d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
119e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
119f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
11a00 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11a10 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
11a20 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
11a30 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
11a40 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
11a50 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
11a60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
11a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11a80 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
11a90 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
11aa0 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
11ab0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
11ac0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
11ad0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
11ae0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
11af0 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
11b00 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
11b10 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
11b20 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
11b30 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11b40 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
11b50 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
11b60 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
11b70 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
11b80 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
11b90 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
11ba0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
11bb0 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
11bc0 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
11bd0 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
11be0 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
11bf0 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
11c00 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
11c10 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
11c20 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
11c30 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
11c40 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
11c50 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
11c60 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
11c70 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
11c80 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
11c90 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
11ca0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
11cc0 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
11cd0 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
11ce0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
11cf0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
11d00 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
11d10 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
11d20 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11d30 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
11d40 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
11d50 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
11d60 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11d70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11d80 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
11d90 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
11da0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
11db0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
11dc0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
11dd0 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
11de0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
11df0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
11e00 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
11e10 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
11e20 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
11e30 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
11e40 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
11e50 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
11e60 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
11e70 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
11e80 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
11e90 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
11ea0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11eb0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
11ec0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
11ed0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
11ee0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
11ef0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
11f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
11f10 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
11f20 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
11f30 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
11f40 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
11f50 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
11f60 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
11f70 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
11f80 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
11f90 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
11fa0 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
11fb0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11fc0 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
11fd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11fe0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11ff0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
12000 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
12030 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
12040 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12050 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
12060 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
12070 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
12080 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
12090 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
120a0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
120b0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
120c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
120d0 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  6)usableSize;.#i
120e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
120f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
12100 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
12110 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12120 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
12130 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
12140 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
12150 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12160 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
12170 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
12180 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
12190 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
121a0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
121b0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
121c0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
121d0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
121e0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
121f0 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
12200 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
12210 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
12220 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
12230 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
12240 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
12250 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
12260 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
12270 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
12280 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
12290 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
122a0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
122b0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
122c0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
122d0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
122e0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
122f0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
12300 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
12310 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
12320 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
12330 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
12340 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
12350 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
12360 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
12370 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
12380 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
12390 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
123a0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
123b0 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
123c0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
123d0 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
123e0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
123f0 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
12400 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
12410 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12420 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12430 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
12440 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
12450 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
12460 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
12470 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
12480 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74  5 - 23;.  assert
12490 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
124a0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
124b0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
124c0 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
124d0 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
124e0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
124f0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
12500 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
12510 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
12520 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
12530 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
12540 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12550 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
12560 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
12570 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
12580 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
12590 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
125a0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
125b0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
125c0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
125d0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
125e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
125f0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
12600 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
12610 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
12620 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12630 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
12640 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12650 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
12660 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
12670 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
12680 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
12690 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
126a0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
126b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
126c0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
126d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
126e0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
126f0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
12700 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
12710 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
12720 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
12730 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
12740 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
12750 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
12760 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
12770 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12780 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
12790 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
127a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
127b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
127c0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
127d0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
127e0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
127f0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
12800 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12810 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
12820 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
12830 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
12840 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
12850 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
12860 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
12870 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
12880 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
12890 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
128a0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
128b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
128c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
128d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
128e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
128f0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12900 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
12910 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12920 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
12930 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12940 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
12950 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
12960 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
12970 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
12980 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
12990 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
129a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
129b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
129c0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
129d0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
129e0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
129f0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
12a00 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
12a10 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
12a20 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
12a30 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
12a40 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
12a50 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
12a60 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
12a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
12a80 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
12a90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
12aa0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
12ab0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
12ac0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
12ad0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12ae0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12af0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
12b00 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
12b10 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
12b20 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
12b30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
12b40 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
12b50 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
12b60 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
12b70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12b80 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
12b90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12ba0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
12bb0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12bc0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
12bd0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
12be0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
12bf0 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
12c00 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
12c10 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
12c20 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
12c30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12c40 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12c50 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
12c60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
12c70 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12c90 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
12ca0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
12cb0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
12cc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12cd0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
12ce0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12cf0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
12d00 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
12d10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
12d20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12d30 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
12d40 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
12d50 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
12d60 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
12d70 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
12d80 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
12d90 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
12da0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
12db0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
12dc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
12dd0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
12de0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
12df0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
12e00 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
12e10 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
12e20 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
12e30 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
12e40 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
12e50 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
12e60 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
12e70 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
12e80 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
12e90 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
12ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12eb0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
12ec0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
12ed0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
12ee0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
12ef0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
12f00 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
12f10 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
12f20 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
12f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
12f40 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
12f50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12f60 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
12f70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12f80 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
12f90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12fa0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
12fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
12fc0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
12fd0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
12fe0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
12ff0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
13000 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
13010 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
13020 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
13030 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
13040 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
13050 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
13060 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
13070 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
13080 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
13090 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
130a0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
130b0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
130c0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
130d0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
130e0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
130f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
13100 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
13110 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
13120 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
13130 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
13140 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
13150 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
13160 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
13170 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
13180 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
13190 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
131a0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
131b0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
131c0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
131d0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
131e0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
131f0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
13200 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
13210 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
13220 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
13230 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
13240 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
13250 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
13260 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
13270 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
13280 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
13290 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
132a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
132b0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
132c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
132d0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
132e0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
132f0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
13300 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
13310 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
13320 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13330 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13340 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
13350 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
13360 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
13370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
13380 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
13390 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
133a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
133b0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
133c0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
133d0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
133e0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
133f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13400 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
13410 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
13420 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
13430 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
13440 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
13450 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
13460 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
13470 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13480 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
13490 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
134a0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
134b0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
134c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
134d0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
134e0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
134f0 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
13500 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
13510 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
13520 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
13530 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
13540 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13550 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13560 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
13570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13580 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
13590 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
135a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
135b0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
135c0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
135d0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
135e0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
135f0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
13600 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
13610 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
13620 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
13630 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
13640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
13650 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
13660 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
13670 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
13680 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
13690 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
136a0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
136b0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
136c0 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
136d0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
136e0 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
136f0 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
13700 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
13710 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
13720 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
13730 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
13740 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
13750 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13770 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
13780 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
13790 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
137a0 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
137b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
137c0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
137d0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
137e0 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
137f0 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
13800 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
13810 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13820 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
13830 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
13840 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
13850 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
13860 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
13870 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
13880 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
13890 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
138a0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
138b0 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53  ened. */.  if( S
138c0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
138d0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
138e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
138f0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
13900 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  OCK)) ){.    got
13910 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13920 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f   }..  do {.    /
13930 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
13940 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
13950 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
13960 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
13970 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
13980 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
13990 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
139a0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
139b0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
139c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
139d0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
139e0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
139f0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
13a00 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
13a10 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
13a20 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
13a30 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
13a40 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
13a50 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
13a60 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
13a70 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
13a80 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
13a90 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
13aa0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13ab0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
13ac0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
13ad0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
13ae0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
13af0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
13b00 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
13b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13b20 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13b30 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
13b40 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
13b50 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13b60 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
13b70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13b80 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
13b90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
13ba0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
13bb0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
13bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13be0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
13bf0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
13c00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13c10 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
13c20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13c30 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
13c40 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
13c50 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
13c60 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
13c70 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
13c80 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13c90 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
13ca0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
13cb0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
13cc0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
13cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13ce0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13cf0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
13d00 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
13d10 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
13d20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13d30 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
13d40 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13d50 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
13d60 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
13d70 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
13d80 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13d90 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
13da0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
13db0 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
13dc0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
13dd0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
13de0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
13df0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
13e00 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
13e10 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
13e20 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
13e30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
13e40 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
13e50 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13e60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13e70 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
13e80 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13e90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13ea0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
13eb0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
13ec0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13ed0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
13ee0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
13ef0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
13f00 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
13f10 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
13f20 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
13f30 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
13f40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13f50 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13f60 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
13f70 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
13f80 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
13f90 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
13fa0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
13fb0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
13fc0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13fd0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13fe0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
13ff0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
14000 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14010 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
14020 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
14030 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
14040 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14050 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
14060 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
14070 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
14080 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14090 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
140a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
140b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
140c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
140d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
140e0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
140f0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
14100 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
14110 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
14120 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
14130 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
14140 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
14150 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
14160 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
14170 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
14180 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
14190 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
141a0 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
141b0 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
141c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
141d0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14200 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14210 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14230 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
14240 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
14250 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14280 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
14290 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
142a0 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
142b0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
142c0 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
142d0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
142e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
142f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14300 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14310 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
14320 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
14330 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
14350 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14360 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
14370 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14380 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
14390 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
143a0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
143b0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
143c0 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
143d0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
143e0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
143f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
14410 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
14420 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
14430 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
14440 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
14450 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
14460 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
14470 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
14480 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
14490 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
144a0 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
144b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
144c0 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
144d0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
144e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
144f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
14500 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
14510 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
14520 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
14530 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
14540 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
14550 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
14560 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
14570 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
14580 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
14590 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
145a0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
145b0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
145c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
145d0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
145e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
145f0 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
14600 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
14610 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
14620 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
14630 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
14640 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
14650 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
14660 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
14670 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
14680 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
14690 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
146a0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
146b0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
146c0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
146e0 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
146f0 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
14700 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
14710 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
14720 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14730 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
14760 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
14770 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
14780 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
14790 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
147a0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
147b0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
147c0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
147d0 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
147e0 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
147f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
14800 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
14810 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
14820 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
14830 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
14840 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
14850 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
14860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14870 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
14880 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
14890 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
148a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
148b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
148c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
148d0 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
148e0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
148f0 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
14900 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
14910 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
14920 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
14930 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
14940 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
14950 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14970 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
14980 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
14990 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
149a0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
149b0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
149c0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
149d0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
149e0 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
149f0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
14a00 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
14a10 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
14a20 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
14a30 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
14a40 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
14a50 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
14a60 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
14a70 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
14a80 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
14a90 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
14aa0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
14ab0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
14ac0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
14ad0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
14ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
14af0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
14b00 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
14b10 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
14b20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
14b30 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
14b40 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
14b50 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
14b60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
14b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
14b90 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
14ba0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
14bb0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
14bc0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
14bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14bf0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
14c00 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
14c10 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
14c20 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
14c30 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
14c40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
14c50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
14c60 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
14c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14c80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
14c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14ca0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
14cb0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14cc0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
14cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
14ce0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
14cf0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
14d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14d10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
14d20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
14d30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
14d40 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
14d50 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
14d60 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
14d70 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
14d80 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
14d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
14da0 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
14db0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
14dc0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
14dd0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
14de0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
14df0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
14e00 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
14e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
14e30 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
14e40 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
14e50 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
14e60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14e70 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
14e80 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
14e90 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
14ea0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
14eb0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
14ec0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
14ed0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
14ee0 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  mit.){.  MemPage
14ef0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
14f00 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
14f10 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
14f20 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
14f30 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
14f40 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
14f50 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
14f60 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
14f70 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
14f80 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
14f90 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
14fa0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
14fb0 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
14fc0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
14fd0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
14fe0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
14ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15010 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15020 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
15030 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
15040 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
15050 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
15060 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
15070 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
15080 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
15090 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
150a0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
150b0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
150c0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
150d0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
150e0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
150f0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
15100 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15110 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
15120 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
15130 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
15140 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
15150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15160 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15170 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
15180 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
15190 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
151a0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
151b0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
151c0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
151d0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
151e0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
151f0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
15200 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
15210 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
15220 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
15230 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
15240 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
15250 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
15260 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
15270 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
15280 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
15290 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
152a0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
152b0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
152c0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
152d0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
152e0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
152f0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
15300 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
15310 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
15320 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
15330 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15340 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
15350 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
15360 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
15370 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
15380 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
15390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
153a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
153b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
153c0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
153d0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
153e0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
153f0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
15400 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
15410 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
15420 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
15430 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
15440 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
15450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15460 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15470 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
15490 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
154a0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
154b0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
154c0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
154d0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
154e0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
154f0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
15500 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
15510 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
15520 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
15530 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
15540 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
15550 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
15560 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
15570 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
15580 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
155a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
155b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
155c0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
155d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
155e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
155f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15600 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15610 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
15620 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15630 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
15640 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
15650 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
15660 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
15670 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
15680 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
15690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
156a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
156b0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
156c0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
156d0 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rPage);.    }.  
156e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
156f0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
15700 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
15710 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
15720 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
15730 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
15740 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
15750 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
15760 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
15770 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
15780 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
15790 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
157a0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
157b0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
157c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
157d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
157e0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
157f0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
15800 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
15810 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
15820 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
15830 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
15840 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
15850 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
15860 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
15870 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
15880 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
15890 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
158a0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
158b0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
158c0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
158d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
158e0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
158f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
15900 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
15910 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
15920 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
15930 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
15940 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
15950 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
15960 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
15970 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
15980 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
15990 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
159a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
159b0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
159c0 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
159d0 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
159e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
15a00 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
15a10 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
15a20 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e  astPg){.  Pgno n
15a30 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
15a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15a50 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
15a60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
15a70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15a80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15a90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15aa0 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
15ab0 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
15ac0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
15ad0 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
15ae0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
15af0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
15b00 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
15b10 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
15b20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
15b30 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
15b40 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
15b50 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
15b60 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
15b70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
15b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15b90 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
15ba0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
15bb0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
15bc0 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
15bd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15bf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15c00 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
15c10 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
15c20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15c40 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
15c50 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15c60 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
15c70 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
15c80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
15c90 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
15ca0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
15cb0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
15cc0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
15cd0 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
15ce0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
15cf0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
15d00 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
15d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
15d20 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
15d30 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
15d40 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
15d50 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
15d60 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
15d70 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
15d80 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
15d90 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
15da0 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
15db0 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
15dc0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
15dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
15de0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
15df0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
15e00 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
15e10 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
15e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15e50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
15e60 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
15e70 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
15e80 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
15e90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
15ea0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
15eb0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15ed0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
15ee0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
15ef0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
15f00 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
15f10 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
15f20 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
15f30 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
15f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15f70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15f80 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65  /* If nFin is ze
15f90 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75  ro, this loop ru
15fa0 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20  ns exactly once 
15fb0 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67  and page pLastPg
15fc0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61  .      ** is swa
15fd0 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69  pped with the fi
15fe0 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75  rst free page pu
15ff0 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65  lled off the fre
16000 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a  e list..      **
16010 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65  .      ** On the
16020 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20   other hand, if 
16030 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72 20  nFin is greater 
16040 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
16050 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
16060 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
16070 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
16080 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
16090 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
160a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
160b0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
160c0 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   */.      do {. 
160d0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
160e0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
160f0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
16100 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
16110 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
16120 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
16130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16150 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
16160 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
16170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16180 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
16190 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
161a0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
161b0 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65 65  nFin!=0 && iFree
161c0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
161d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
161e0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
161f0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71    .      rc = sq
16200 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
16210 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67 65  pLastPg->pDbPage
16220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16240 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
16250 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
16260 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
16270 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20  rPage, iFreePg, 
16280 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20  nFin!=0);.      
16290 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
162a0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
162b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
162c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
162d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
162e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
162f0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
16300 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
16310 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74 50     while( iLastP
16320 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
16330 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41  PAGE(pBt)||PTRMA
16340 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
16350 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20 20  astPg) ){.      
16360 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
16370 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
16380 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  ){.        MemPa
16390 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 20  ge *pPg;.       
163a0 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
163b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
163c0 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  tPg, &pPg, 0);. 
163d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
163e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
163f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16420 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
16430 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
16440 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
16450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16470 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16480 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
164a0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
164b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
164c0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
164d0 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
164e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
164f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16500 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
16510 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
16520 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
16530 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
16540 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
16550 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
16560 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
16570 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
16580 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
16590 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
165a0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
165b0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
165c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
165d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
165e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
165f0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
16600 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
16610 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
16620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
16630 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
16640 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16650 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
16660 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
16670 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
16680 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
16690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
166a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
166b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
166c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
166d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
166e0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
166f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
16700 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
16710 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
16730 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
16740 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
16750 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
16760 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
16770 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
16780 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  0, pagerPagecoun
16790 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73  t(pBt));.  }.  s
167a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
167b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
167c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
167d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
167e0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
167f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
16800 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
16810 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
16820 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
16830 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
16840 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
16850 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
16860 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
16870 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
16880 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
16890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
168a0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
168b0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
168c0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
168d0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
168e0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
168f0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
16900 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
16910 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
16920 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
16930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
16940 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
16950 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16960 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16970 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
16980 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
16990 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
169a0 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
169b0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
169c0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
169d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
169e0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
169f0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
16a00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
16a10 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
16a20 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
16a30 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
16a40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
16a50 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
16a60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16a70 20 6f 66 20 70 61 67 65 73 20 74 6f 20 62 65 20   of pages to be 
16a80 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
16a90 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
16aa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16ab0 65 73 20 6e 6f 20 74 68 65 20 66 72 65 65 6c 69  es no the freeli
16ac0 73 74 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  st */.    Pgno n
16ad0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
16ae0 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
16af0 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
16b00 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ed */.    Pgno i
16b10 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
16b20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
16b30 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
16b40 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
16b50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16b60 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
16b70 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
16b80 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
16b90 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
16ba0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
16bb0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
16bc0 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  rig = pagerPagec
16bd0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
16be0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
16bf0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
16c00 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
16c10 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
16c20 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
16c30 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
16c40 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
16c50 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
16c60 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
16c70 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
16c80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
16c90 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
16ca0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
16cb0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
16cc0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
16cd0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
16ce0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
16cf0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16d00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16d10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
16d20 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
16d30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
16d40 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72  [36]);.    nEntr
16d50 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
16d60 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d  ize/5;.    nPtrm
16d70 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
16d80 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
16d90 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
16da0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20  ry)/nEntry;.    
16db0 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
16dc0 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
16dd0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
16de0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
16df0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
16e00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
16e10 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
16e20 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
16e30 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
16e40 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
16e50 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
16e60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
16e70 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
16e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
16e90 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
16ea0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16eb0 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
16ec0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
16ed0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
16ee0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
16ef0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
16f00 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
16f10 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b  t, nFin, iFree);
16f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
16f30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
16f40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
16f50 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
16f60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16f70 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  E_OK;.      rc =
16f80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16f90 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
16fa0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
16fb0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
16fc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
16fd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
16fe0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
16ff0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
17000 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
17010 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
17020 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
17030 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
17040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17050 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
17060 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
17070 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
17080 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
17090 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
170a0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
170b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
170c0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
170d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
170e0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
170f0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
17100 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
17110 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
17120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17130 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
17140 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
17150 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
17160 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
17170 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
17180 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
17190 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
171a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
171b0 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
171c0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
171d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
171e0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
171f0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
17200 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
17210 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
17220 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
17230 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
17240 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
17250 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
17260 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
17270 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
17280 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
17290 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
172a0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
172b0 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
172c0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
172d0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
172e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
172f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
17300 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
17310 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
17320 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
17330 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
17340 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
17350 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
17360 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
17370 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
17380 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
17390 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
173a0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
173b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
173c0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
173d0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
173e0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
173f0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
17400 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
17410 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
17420 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
17430 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
17440 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
17450 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
17460 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
17470 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
17480 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
17490 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
174a0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
174b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
174c0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
174d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
174e0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
174f0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
17500 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
17510 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
17520 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
17530 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
17540 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
17550 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
17560 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
17570 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
17580 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
17590 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
175a0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
175b0 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
175c0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
175d0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
175e0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
175f0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
17600 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
17610 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
17620 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
17630 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
17640 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
17650 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
17660 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
17670 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
17680 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
17690 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
176a0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
176b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
176c0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
176d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
176e0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
176f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17700 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17710 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
17720 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17730 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
17740 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
17750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17760 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
17770 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
17780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
177a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
177b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
177c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
177d0 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
177e0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
177f0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
17800 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
17810 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
17820 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17830 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17840 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17850 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17860 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
17870 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
17880 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
17890 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
178a0 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
178b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
178c0 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
178d0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
178e0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
178f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17900 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
17910 70 43 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20  pCsr;.  assert( 
17920 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
17930 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20  sMutex(p) );..  
17940 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
17950 63 75 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e  cursor held open
17960 20 62 79 20 74 68 69 73 20 62 2d 74 72 65 65 20   by this b-tree 
17970 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f  connection. If o
17980 6e 65 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20  ne exists,.  ** 
17990 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  then the transac
179a0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77  tion will be dow
179b0 6e 67 72 61 64 65 64 20 74 6f 20 61 20 72 65 61  ngraded to a rea
179c0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
179d0 6f 6e 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20  on.  ** instead 
179e0 6f 66 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63  of actually conc
179f0 6c 75 64 65 64 2e 20 41 20 73 75 62 73 65 71 75  luded. A subsequ
17a00 65 6e 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d  ent call to Comm
17a10 69 74 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20  itPhaseTwo() .  
17a20 2a 2a 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29  ** or Rollback()
17a30 20 77 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65   will finish the
17a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
17a50 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
17a60 62 61 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  base.  */.  for(
17a70 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCsr=pBt->pCurso
17a80 72 3b 20 70 43 73 72 20 26 26 20 70 43 73 72 2d  r; pCsr && pCsr-
17a90 3e 70 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72  >pBtree!=p; pCsr
17aa0 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20  =pCsr->pNext);. 
17ab0 20 61 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30   assert( pCsr==0
17ac0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54   || p->inTrans>T
17ad0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20  RANS_NONE );..  
17ae0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
17af0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28  tent(pBt);.  if(
17b00 20 70 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77   pCsr ){.    dow
17b10 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
17b20 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
17b30 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
17b40 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
17b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
17b60 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
17b70 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
17b80 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
17b90 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
17ba0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
17bb0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
17bc0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
17bd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17be0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
17bf0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
17c00 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
17c10 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
17c20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
17c30 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
17c40 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
17c50 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
17c60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
17c70 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
17c80 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
17c90 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
17ca0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
17cb0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
17cc0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
17cd0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
17ce0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
17cf0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
17d00 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
17d10 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
17d20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
17d30 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
17d40 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
17d50 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
17d60 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
17d70 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
17d80 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
17d90 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
17da0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
17db0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
17dc0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
17dd0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
17de0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17df0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
17e00 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
17e10 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
17e20 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
17e30 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
17e40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e50 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
17e60 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
17e70 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
17e80 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
17e90 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
17ea0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
17eb0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
17ec0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
17ed0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
17ee0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
17ef0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
17f00 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
17f10 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
17f20 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
17f30 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
17f40 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
17f50 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
17f60 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
17f70 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
17f80 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
17f90 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
17fa0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
17fb0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
17fc0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
17fd0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
17fe0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
17ff0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
18000 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
18010 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
18020 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18030 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
18040 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
18050 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
18060 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
18070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18080 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
18090 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
180a0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
180b0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
180c0 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
180d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
180e0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
180f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
18100 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18110 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
18120 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18130 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
18140 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
18150 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
18160 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
18170 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
18180 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
18190 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
181a0 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
181b0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
181c0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
181d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
181e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
181f0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
18200 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18210 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18220 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
18230 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
18240 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
18250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18260 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
18270 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
18280 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18290 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
182a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
182b0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
182c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
182d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
182e0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
182f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18300 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18310 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18320 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18340 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
18350 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
18360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18370 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
18380 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
18390 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
183a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
183b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
183c0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
183d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
183e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
183f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18400 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20  itPhaseTwo(p);. 
18410 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18420 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18440 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
18450 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18460 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f  r of write-curso
18470 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
18480 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
18490 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
184a0 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
184b0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
184c0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
184d0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
184e0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  efined..**.** Fo
184f0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
18500 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
18510 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69  a write-cursor i
18520 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
18530 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
18540 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  of writing to th
18550 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61 74  e databse.  That
18560 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f   means the curso
18570 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61  r was.** origina
18580 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  lly opened for w
18590 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63  riting and the c
185a0 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65  ursor has not be
185b0 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20   disabled.** by 
185c0 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74 65  having its state
185d0 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53   changed to CURS
185e0 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61  OR_FAULT..*/.sta
185f0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69  tic int countWri
18600 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  teCursors(BtShar
18610 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
18620 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e  rsor *pCur;.  in
18630 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  t r = 0;.  for(p
18640 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  Cur=pBt->pCursor
18650 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75  ; pCur; pCur=pCu
18660 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
18670 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  f( pCur->wrFlag 
18680 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  && pCur->eState!
18690 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20  =CURSOR_FAULT ) 
186a0 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  r++; .  }.  retu
186b0 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn r;.}.#endif..
186c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
186d0 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
186e0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
186f0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
18700 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
18710 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
18720 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20  sor on BtShared 
18730 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
18740 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
18750 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
18760 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
18770 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74  ing cursors that
18780 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74   belong.** to ot
18790 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
187a0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
187b0 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69  ppen to be shari
187c0 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  ng.** the cache 
187d0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
187e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
187f0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
18800 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18810 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  rs..** All curso
18820 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  rs using the sam
18830 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  e cache must be 
18840 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72  tripped.** to pr
18850 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20  event them from 
18860 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
18870 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a  e btree after.**
18880 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20   the rollback.  
18890 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
188a0 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61   have deleted ta
188b0 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64  bles.** or moved
188c0 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20   root pages, so 
188d0 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63  it is not suffic
188e0 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20  ient to.** save 
188f0 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
18900 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75   cursor.  The cu
18910 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20  rsor must be.** 
18920 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
18930 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
18940 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
18950 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
18960 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42  nt errCode){.  B
18970 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71  tCursor *p;.  sq
18980 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18990 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
189a0 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
189b0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
189c0 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
189d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
189e0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
189f0 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
18a00 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
18a10 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72      p->skip = er
18a20 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69  rCode;.    for(i
18a30 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b  =0; i<=p->iPage;
18a40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
18a50 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61  easePage(p->apPa
18a60 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d  ge[i]);.      p-
18a70 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
18a80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18a90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
18aa0 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
18ab0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
18ac0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
18ad0 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
18ae0 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
18af0 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
18b00 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
18b10 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
18b20 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
18b30 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
18b40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
18b50 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
18b60 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
18b70 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
18b80 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
18b90 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
18ba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18bb0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
18bc0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
18bd0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
18be0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
18bf0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
18c00 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
18c10 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
18c20 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
18c30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18c40 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
18c50 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
18c60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18c70 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
18c80 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
18c90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18ca0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
18cb0 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  HE.  if( rc!=SQL
18cc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
18cd0 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69   This is a horri
18ce0 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41  ble situation. A
18cf0 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29  n IO or malloc()
18d00 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
18d10 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
18d20 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
18d30 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
18d40 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
18d50 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
18d60 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
18d70 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
18d80 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
18d90 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
18da0 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
18db0 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
18dc0 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
18dd0 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
18de0 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
18df0 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
18e00 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
18e10 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
18e20 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
18e30 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
18e40 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
18e50 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
18e60 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
18e70 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
18e80 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
18e90 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
18ea0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
18eb0 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
18ec0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
18ed0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66  egrity(p);..  if
18ee0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18ef0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
18f00 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61   int rc2;..    a
18f10 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
18f20 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
18f30 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
18f40 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
18f50 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
18f60 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
18f70 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
18f80 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
18f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
18fa0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
18fb0 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
18fc0 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
18fd0 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
18fe0 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74  ** call btreeGet
18ff0 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31  Page() on page 1
19000 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20   again to make. 
19010 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65     ** sure pPage
19020 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20  1->aData is set 
19030 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20  correctly. */.  
19040 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61    if( btreeGetPa
19050 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
19060 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
19070 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
19080 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
19090 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
190a0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
190b0 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
190c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
190d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
190e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
190f0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
19100 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19110 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19120 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19130 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
19140 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
19150 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
19160 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
19170 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
19180 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
19190 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
191a0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
191b0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
191c0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
191d0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
191e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
191f0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
19200 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
19210 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
19220 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
19230 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
19240 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
19250 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
19260 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
19270 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
19280 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
19290 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
192a0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
192b0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
192c0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
192d0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
192e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
192f0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
19300 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
19310 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
19320 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
19330 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
19340 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
19350 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
19360 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
19370 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
19380 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
19390 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
193a0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
193b0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
193c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
193d0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
193e0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
193f0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
19400 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
19410 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
19420 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
19430 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
19440 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
19450 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
19460 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
19470 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
19480 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
19490 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
194a0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
194b0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
194c0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
194d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
194e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
194f0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
19500 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
19510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19520 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
19530 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
19540 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
19550 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19560 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
19570 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
19580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
19590 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
195a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
195b0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d  ( pBt->readOnly=
195c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
195d0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
195e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
195f0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
19600 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20  epoint );.  if( 
19610 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73  NEVER(p->inTrans
19620 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
19630 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
19640 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19650 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d  TE_INTERNAL;.  }
19660 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
19670 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19680 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
19690 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74  E );.    /* At t
196a0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
196b0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
196c0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
196d0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20  epoint with.    
196e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
196f0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
19700 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
19710 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
19720 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  .    ** SQL stat
19730 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
19740 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
19750 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
19760 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75  ck any.    ** su
19770 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
19780 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
19790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
197a0 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
197b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
197c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
197d0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
197e0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
197f0 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ment);.  }.  sql
19800 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19820 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
19830 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
19840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
19850 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
19860 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
19870 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
19880 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
19890 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
198a0 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
198b0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
198c0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
198d0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
198e0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
198f0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
19900 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
19910 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
19920 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
19930 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
19940 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
19950 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
19960 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
19970 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
19980 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
19990 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
199a0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
199b0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
199c0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
199d0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
199e0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
199f0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
19a00 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
19a10 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
19a20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
19a30 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
19a40 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
19a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19a60 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
19a70 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
19a80 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
19a90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19aa0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
19ab0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
19ac0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
19ad0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19ae0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
19af0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
19b00 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
19b10 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
19b20 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
19b30 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
19b40 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
19b50 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
19b60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
19b70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
19b80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19ba0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
19bb0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
19bc0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
19bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19be0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e   ){.      rc = n
19bf0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
19c00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
19c10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19c20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19c40 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
19c50 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
19c60 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
19c70 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
19c80 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
19c90 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
19ca0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
19cb0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
19cc0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
19cd0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
19ce0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
19cf0 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
19d00 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
19d10 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
19d20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
19d30 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
19d40 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
19d50 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
19d60 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
19d70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
19d80 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
19d90 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
19da0 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
19db0 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
19dc0 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
19dd0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
19de0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
19df0 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
19e00 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
19e10 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
19e20 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
19e30 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
19e40 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
19e50 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
19e60 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
19e70 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
19e80 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
19e90 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
19ea0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
19eb0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
19ec0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
19ed0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19ee0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
19ef0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
19f00 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
19f10 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
19f20 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
19f30 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
19f40 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
19f50 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
19f60 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
19f70 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
19f80 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
19f90 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
19fa0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
19fb0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
19fc0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
19fd0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
19fe0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
19ff0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a000 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
1a010 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
1a020 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
1a030 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
1a040 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
1a050 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
1a060 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
1a070 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
1a080 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
1a090 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1a0a0 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
1a0b0 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
1a0c0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
1a0d0 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
1a0e0 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
1a0f0 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
1a100 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
1a110 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
1a120 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1a130 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
1a140 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62  eeCursorSize() b
1a150 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a  ytes of memory .
1a160 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
1a170 20 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20   pCur have been 
1a180 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61  zeroed by the ca
1a190 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a1a0 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1a1b0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a1e0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1a1f0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a210 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1a220 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1a230 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1a240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a260 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a270 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a280 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a290 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a2a0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1a2b0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1a2c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1a2d0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1a300 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1a310 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1a320 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1a330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1a340 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1a350 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1a360 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a370 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a380 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1a390 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1a3a0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1a3b0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1a3c0 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1a3d0 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1a3e0 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1a3f0 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1a400 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1a410 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1a420 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1a430 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1a440 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1a450 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1a460 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1a470 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1a480 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1a490 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1a4a0 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1a4b0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1a4c0 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1a4d0 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1a4e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a4f0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1a500 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1a510 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1a520 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1a530 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1a540 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1a550 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1a560 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1a570 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1a580 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1a590 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1a5a0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1a5b0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1a5c0 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1a5d0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1a5e0 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1a5f0 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1a600 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1a610 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1a620 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1a630 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
1a640 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1a650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1a660 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1a670 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1a680 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1a690 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1a6a0 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1a6b0 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1a6c0 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1a6d0 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1a6e0 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1a6f0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1a700 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1a710 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1a720 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1a730 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1a740 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1a750 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1a760 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1a770 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1a780 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1a790 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1a7a0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1a7b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1a7c0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1a7d0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1a7e0 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1a7f0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1a800 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a810 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1a820 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1a830 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1a840 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1a850 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1a860 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1a8a0 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a8d0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1a8e0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1a8f0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a920 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1a930 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1a940 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1a950 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1a960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1a970 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1a980 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1a990 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1a9c0 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1a9d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1a9e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a9f0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1aa00 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1aa10 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1aa20 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1aa30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aa40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1aa50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1aa60 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1aa70 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1aa80 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1aa90 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1aaa0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1aab0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1aac0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1aad0 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1aae0 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1aaf0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1ab00 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1ab10 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1ab20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1ab30 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1ab40 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1ab50 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1ab60 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1ab70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ab80 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1ab90 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1aba0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
1abb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1abc0 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1abd0 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1abe0 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1abf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1ac00 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1ac10 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1ac20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1ac30 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1ac40 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1ac50 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1ac60 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1ac70 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1ac80 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1ac90 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1aca0 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1acb0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1acc0 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1acd0 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1ace0 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1acf0 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1ad00 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1ad10 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1ad20 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1ad30 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1ad40 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1ad50 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1ad60 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1ad70 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1ad80 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1ad90 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1ada0 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1adb0 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1adc0 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1add0 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1ade0 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1adf0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1ae00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1ae10 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1ae20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1ae30 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1ae40 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1ae50 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1ae60 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1ae70 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ae80 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1ae90 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1aea0 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1aeb0 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1aec0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1aed0 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1aee0 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1aef0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1af00 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1af10 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1af20 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1af30 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1af40 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1af50 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1af60 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1af70 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1af80 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1af90 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1afa0 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1afb0 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1afc0 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1afd0 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1afe0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1aff0 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1b000 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1b010 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1b020 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1b030 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1b040 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1b050 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1b060 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1b070 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1b080 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1b090 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1b0a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1b0b0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1b0c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1b0d0 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1b0e0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1b0f0 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1b100 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1b110 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1b120 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1b130 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1b140 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1b150 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1b160 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1b170 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1b180 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1b190 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1b1a0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1b1b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1b1c0 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1b1d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1b1e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1b1f0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1b200 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1b210 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1b220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1b230 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1b240 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b250 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1b260 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1b270 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b280 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1b290 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1b2a0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1b2b0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1b2c0 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1b2d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b2e0 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1b2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1b310 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1b320 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1b330 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1b340 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1b350 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1b360 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1b370 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1b380 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1b390 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1b3a0 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1b3b0 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1b3c0 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1b3d0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1b3e0 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1b3f0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1b400 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1b410 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1b420 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1b430 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1b440 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1b450 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1b460 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1b470 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1b480 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1b490 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1b4a0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1b4b0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1b4c0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1b4d0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1b4e0 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1b4f0 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1b500 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1b510 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1b520 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1b530 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1b540 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1b550 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1b560 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1b570 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1b580 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1b590 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1b5a0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1b5b0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1b5c0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1b5d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1b5e0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1b5f0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1b600 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b610 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1b620 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1b630 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1b640 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1b650 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1b660 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1b670 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1b680 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1b690 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b6a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1b6b0 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1b6c0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1b6d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1b6e0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1b6f0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1b700 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1b710 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1b720 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1b730 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1b740 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1b750 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1b760 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1b770 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1b780 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1b790 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1b7a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1b7b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1b7c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1b7d0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1b7e0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1b7f0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1b800 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b810 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1b820 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1b830 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1b840 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1b850 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b860 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1b870 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1b880 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1b890 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1b8a0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1b8b0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1b8c0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1b8d0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1b8e0 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1b930 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1b980 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1b9d0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1b9e0 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1b9f0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1ba00 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1ba10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1ba20 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ba60 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bab0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1bac0 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bb00 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1bb10 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
1bb20 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1bb30 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1bb40 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1bb50 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1bb60 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1bb70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1bb80 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1bb90 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1bba0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1bbb0 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1bbc0 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1bbd0 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1bbe0 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1bbf0 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1bc00 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1bc10 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1bc20 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1bc30 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1bc40 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
1bc50 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1bc60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bc70 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1bc80 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bc90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bca0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1bcb0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1bcc0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1bcd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1bcf0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1bd00 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bd10 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1bd20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1bd30 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1bd40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bd50 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1bd60 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
1bd70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
1bd80 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1bd90 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
1bda0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1bdb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1bdc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bdd0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1bde0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1bdf0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
1be00 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
1be10 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
1be20 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
1be30 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
1be40 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
1be50 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1be60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1be70 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
1be80 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
1be90 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
1bea0 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
1beb0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
1bec0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
1bed0 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
1bee0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
1bef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bf00 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1bf10 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1bf20 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1bf30 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1bf40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1bf50 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1bf60 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1bf70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1bf80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bf90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
1bfa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bfb0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1bfc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1bfd0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
1bfe0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1bff0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1c000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
1c010 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
1c020 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
1c030 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
1c040 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
1c050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c060 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
1c070 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
1c080 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1c090 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
1c0a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c0b0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1c0c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1c0d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1c0e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1c0f0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1c100 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1c110 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1c120 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1c130 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1c140 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1c150 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1c160 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1c170 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1c180 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1c190 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1c1a0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1c1b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1c1c0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1c1d0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1c1e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1c1f0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1c200 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1c210 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1c220 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1c230 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1c240 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1c250 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1c260 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1c270 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1c280 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1c290 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1c2a0 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1c2b0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1c2c0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1c2d0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1c2e0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1c2f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1c300 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1c310 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1c320 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1c330 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1c340 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1c350 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1c360 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1c370 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1c380 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1c390 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1c3a0 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1c3b0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1c3c0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1c3d0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1c3e0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1c3f0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1c400 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1c410 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1c420 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1c430 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1c440 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1c450 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1c460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1c470 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1c480 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4a0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1c4b0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1c4c0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1c4d0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1c4e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1c4f0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1c500 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1c510 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1c520 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1c530 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1c540 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1c550 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1c560 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1c570 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1c580 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1c590 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1c5a0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1c5b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c5c0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1c5d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c5e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1c5f0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1c600 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1c610 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c620 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1c630 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1c640 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1c650 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1c660 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1c670 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1c680 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1c690 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1c6a0 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1c6b0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1c6c0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1c6d0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1c6e0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1c6f0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1c700 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1c710 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1c720 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1c730 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1c740 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1c750 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1c760 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1c770 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1c780 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1c790 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1c7a0 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1c7b0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1c7c0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1c7d0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1c7e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1c7f0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1c800 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1c810 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1c820 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
1c830 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1c840 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1c850 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1c860 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1c870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c880 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1c890 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1c8a0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1c8b0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1c8c0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1c8d0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1c8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c8f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1c900 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1c910 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1c920 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1c930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1c940 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1c950 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1c960 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1c970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c980 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1c990 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c9a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1c9b0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1c9c0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1c9d0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1c9e0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1c9f0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1ca00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1ca10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ca20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1ca30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ca40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1ca50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1ca60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1ca70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1ca80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1ca90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1caa0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1cab0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1cac0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1cad0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1cae0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1caf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1cb00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1cb10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1cb20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1cb30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1cb40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1cb50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1cb60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1cb70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1cb80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cb90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1cba0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1cbb0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1cbc0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1cbd0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1cbe0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1cbf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1cc00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1cc10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1cc20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1cc30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1cc40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1cc50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1cc60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1cc70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1cc80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cca0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1ccb0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1ccc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ccd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1cce0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1ccf0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1cd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1cd10 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1cd20 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1cd30 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1cd40 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1cd50 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1cd60 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1cd70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1cd80 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1cd90 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1cda0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1cdb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1cdc0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1cdd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1cde0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cdf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ce00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ce10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1ce20 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1ce30 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1ce40 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1ce50 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1ce60 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1ce70 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1ce80 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1ce90 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1cea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1ceb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1cec0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ced0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1cee0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1cef0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1cf00 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1cf10 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1cf20 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1cf30 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1cf40 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1cf50 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1cf60 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1cf70 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1cf80 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1cf90 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1cfa0 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1cfb0 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1cfc0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1cfd0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1cfe0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1cff0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1d000 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1d010 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1d020 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1d030 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1d040 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
1d050 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
1d060 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
1d070 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
1d080 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
1d090 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
1d0a0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
1d0b0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
1d0c0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1d0d0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1d0e0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1d0f0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1d100 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1d110 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1d120 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1d130 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1d140 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1d150 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1d160 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1d170 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1d180 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1d190 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1d1a0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1d1b0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1d1c0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1d1d0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1d1e0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1d1f0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1d200 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1d210 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1d220 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1d230 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1d240 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1d250 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1d260 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1d270 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1d280 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1d290 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1d2a0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1d2b0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1d2c0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1d2d0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1d2e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1d2f0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1d300 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1d310 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1d320 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1d330 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1d340 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1d350 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1d360 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1d370 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1d380 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1d390 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1d3a0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1d3b0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1d3c0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1d3d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1d3e0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1d3f0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1d400 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1d410 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1d420 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1d430 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1d440 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1d450 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1d460 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1d470 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1d480 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1d490 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1d4a0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1d4b0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1d4c0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
1d4d0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
1d4e0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
1d4f0 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
1d500 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1d510 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
1d520 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d530 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
1d540 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
1d550 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1d560 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d570 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
1d580 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
1d590 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
1d5a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1d5b0 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1d5c0 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1d5d0 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
1d5e0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
1d5f0 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
1d600 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1d610 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1d620 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1d630 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1d640 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1d650 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
1d660 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1d670 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
1d680 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1d690 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1d6a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1d6b0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
1d6c0 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
1d6d0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
1d6e0 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
1d6f0 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
1d700 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
1d710 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1d720 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
1d730 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1d740 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1d750 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1d760 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1d770 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1d780 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1d790 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1d7a0 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1d7b0 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1d7c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d7d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d7e0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1d7f0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1d800 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1d810 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1d820 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1d830 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1d840 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1d850 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1d860 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1d870 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1d880 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1d890 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1d8a0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1d8b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1d8c0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1d8d0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1d8e0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1d8f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1d900 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1d910 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1d920 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1d930 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1d940 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1d950 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1d960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1d970 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1d980 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1d990 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1d9a0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1d9b0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1d9c0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1d9d0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1d9e0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1d9f0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1da00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1da10 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1da20 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1da30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1da40 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1da50 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1da60 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1da70 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1da80 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1da90 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1daa0 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1dab0 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1dac0 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1dad0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1dae0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1daf0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1db00 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1db10 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1db20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1db30 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1db40 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1db50 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1db60 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1db70 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1db80 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1db90 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1dba0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1dbb0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1dbc0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1dbd0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1dbe0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1dbf0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1dc00 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1dc10 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1dc20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1dc30 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1dc40 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1dc50 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1dc60 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1dc70 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1dc80 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1dc90 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
1dca0 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1dcb0 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
1dcc0 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
1dcd0 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
1dce0 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
1dcf0 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
1dd00 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
1dd10 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
1dd20 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1dd30 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1dd40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1dd50 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
1dd60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1dd70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1dd80 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1dd90 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
1dda0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
1ddb0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
1ddc0 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
1ddd0 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
1dde0 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
1ddf0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
1de00 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
1de10 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
1de20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
1de30 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
1de40 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
1de50 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
1de60 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
1de70 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1de80 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
1de90 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
1dea0 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
1deb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
1dec0 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
1ded0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
1dee0 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
1def0 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
1df00 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1df10 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
1df20 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
1df30 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1df40 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
1df50 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1df60 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1df70 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
1df80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1df90 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
1dfa0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
1dfb0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1dfc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dfd0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
1dfe0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1dff0 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
1e000 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
1e010 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1e020 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
1e030 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
1e040 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
1e050 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
1e060 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
1e070 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1e080 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1e090 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1e0a0 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
1e0b0 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
1e0c0 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
1e0d0 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
1e0e0 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
1e0f0 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
1e100 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
1e110 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
1e120 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
1e130 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
1e140 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
1e150 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1e160 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
1e170 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e180 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
1e190 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
1e1a0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1e1b0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1e1c0 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
1e1d0 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
1e1e0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
1e1f0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
1e200 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
1e210 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
1e220 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
1e230 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
1e240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e250 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
1e260 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
1e270 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
1e280 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
1e290 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
1e2a0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
1e2b0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
1e2c0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
1e2d0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
1e2e0 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
1e2f0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
1e300 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1e310 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e320 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
1e330 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
1e340 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
1e350 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1e360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e370 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
1e380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e390 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
1e3a0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1e3b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
1e3c0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
1e3d0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
1e3e0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
1e400 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
1e410 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1e420 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
1e430 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
1e440 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
1e450 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
1e460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e470 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e480 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
1e490 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
1e4a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
1e4b0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
1e4c0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1e4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e4e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
1e4f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e500 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
1e510 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e520 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1e530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e540 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
1e550 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
1e560 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1e570 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1e580 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1e590 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1e5a0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1e5b0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1e5c0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1e5d0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1e5e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1e5f0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1e600 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1e610 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1e620 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1e630 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1e640 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
1e650 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
1e660 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
1e670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e680 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
1e690 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
1e6a0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
1e6b0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
1e6c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1e6d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e6e0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1e6f0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1e700 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1e710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1e730 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e740 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1e750 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1e760 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1e770 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e780 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ge] );.    if( p
1e790 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
1e7a0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
1e7b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e7c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e7d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
1e7e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e7f0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1e800 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e810 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
1e820 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
1e830 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
1e840 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
1e850 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 20  har*)pBuf, 0);. 
1e860 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e870 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1e880 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1e890 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1e8a0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1e8b0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1e8c0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1e8d0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1e8e0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1e8f0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1e900 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1e910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1e920 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1e930 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1e940 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1e950 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1e960 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1e970 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1e980 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1e990 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1e9a0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1e9b0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1e9c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e9d0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1e9e0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1e9f0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1ea00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ea10 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1ea20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ea30 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1ea40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ea50 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1ea60 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1ea70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ea80 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ea90 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1eaa0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1eab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1eac0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ead0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eae0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1eaf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1eb00 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1eb10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1eb20 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1eb30 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1eb40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1eb50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1eb60 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1eb70 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1eb80 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1eb90 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1eba0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1ebb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1ebc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ebd0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
1ebe0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
1ebf0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
1ec00 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
1ec10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
1ec20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
1ec30 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
1ec40 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
1ec50 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20   skipKey==0 and 
1ec60 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
1ec70 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
1ec80 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79  ta if.** skipKey
1ec90 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ==1.  The number
1eca0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
1ecb0 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20  ilable key/data 
1ecc0 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
1ecd0 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
1ece0 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
1ecf0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1ed00 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61  will not be.** a
1ed10 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
1ed20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1ed30 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
1ed40 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
1ed50 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
1ed60 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
1ed70 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
1ed80 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
1ed90 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
1eda0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
1edb0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
1edc0 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
1edd0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
1ede0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
1edf0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
1ee00 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
1ee10 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
1ee20 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
1ee30 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
1ee40 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1ee50 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
1ee60 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
1ee70 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
1ee80 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
1ee90 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
1eea0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
1eeb0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
1eec0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
1eed0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1eee0 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
1eef0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
1ef00 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
1ef10 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
1ef20 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
1ef30 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
1ef40 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
1ef50 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
1ef60 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1ef70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ef80 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  har *fetchPayloa
1ef90 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1efa0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1efb0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1efc0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1efd0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d  om */.  int *pAm
1efe0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
1eff0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1f000 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1f010 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tes here */.  in
1f020 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20  t skipKey       
1f030 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e     /* read begin
1f040 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20  ning at data if 
1f050 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
1f060 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1f070 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1f080 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1f090 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33    u32 nKey;.  u3
1f0a0 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73  2 nLocal;..  ass
1f0b0 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
1f0c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
1f0d0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
1f0e0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
1f0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f100 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f110 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1f120 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f130 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67  (pCur) );.  pPag
1f140 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1f150 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1f160 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f170 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
1f180 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
1f190 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1f1a0 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1f1b0 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1f1c0 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
1f1d0 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
1f1e0 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
1f1f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1f200 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
1f210 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
1f220 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1f230 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
1f240 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
1f250 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
1f260 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
1f270 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f280 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
1f290 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
1f2a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1f2b0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c  ;.    if( nLocal
1f2c0 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  >nKey ){.      n
1f2d0 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20  Local = nKey;.  
1f2e0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20    }.  }.  *pAmt 
1f2f0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
1f300 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
1f310 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
1f320 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1f330 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
1f340 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
1f350 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
1f360 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
1f370 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
1f380 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
1f390 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
1f3a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1f3b0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
1f3c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
1f3d0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
1f3e0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
1f3f0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
1f400 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
1f410 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
1f420 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
1f430 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
1f440 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
1f450 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
1f460 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
1f470 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
1f480 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
1f490 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
1f4a0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
1f4b0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
1f4c0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
1f4d0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
1f4e0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
1f4f0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
1f500 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
1f510 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
1f520 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
1f530 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
1f540 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
1f550 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
1f560 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
1f570 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
1f580 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
1f590 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1f5a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1f5b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1f5c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f5d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f5e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f5f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f600 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f610 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f  {.    return (co
1f620 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50  nst void*)fetchP
1f630 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
1f640 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t, 0);.  }.  ret
1f650 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76  urn 0;.}.const v
1f660 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
1f670 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72  eDataFetch(BtCur
1f680 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1f690 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28  pAmt){.  assert(
1f6a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f6b0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1f6c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1f6d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f6e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f6f0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1f700 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f710 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1f720 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
1f730 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1f740 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
1f750 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f760 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1f770 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
1f780 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
1f790 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
1f7a0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1f7b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f7c0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
1f7d0 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
1f7e0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
1f7f0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
1f800 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
1f810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1f820 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
1f830 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
1f840 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
1f850 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1f860 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1f870 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f880 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1f890 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f8a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f8b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f8c0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
1f8d0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
1f8e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
1f8f0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
1f900 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
1f910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f920 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1f930 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
1f940 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
1f950 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
1f960 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f970 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
1f980 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
1f990 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
1f9a0 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
1f9b0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
1f9c0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1f9d0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1f9e0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1f9f0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
1fa00 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
1fa10 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
1fa20 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
1fa30 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
1fa40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fa50 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1fa60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fa70 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1fa80 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
1fa90 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
1faa0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
1fab0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
1fac0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
1fad0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
1fae0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1faf0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
1fb00 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
1fb10 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
1fb20 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
1fb30 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1fb40 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1fb50 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
1fb60 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
1fb70 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1fb80 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1fb90 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
1fba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fbb0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1fbc0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
1fbd0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
1fbe0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
1fbf0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
1fc00 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
1fc10 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
1fc20 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
1fc30 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1fc40 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
1fc50 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
1fc60 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
1fc70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1fc80 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1fc90 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
1fca0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
1fcb0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
1fcc0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
1fcd0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
1fce0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
1fcf0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1fd00 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1fd10 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1fd20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1fd30 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1fd40 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1fd50 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1fd60 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1fd70 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1fd80 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1fd90 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1fda0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1fdb0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1fdc0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1fdd0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1fde0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1fdf0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1fe00 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
1fe10 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1fe20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1fe30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1fe40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1fe50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1fe60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1fe70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1fe80 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
1fe90 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1fea0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1feb0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
1fec0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
1fed0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1fee0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
1fef0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ff00 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
1ff10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ff20 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
1ff30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1ff40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1ff50 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
1ff60 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
1ff70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ff80 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1ff90 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
1ffa0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1ffb0 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f 74  rsor to the root
1ffc0 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20   page.*/.static 
1ffd0 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
1ffe0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1fff0 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
20000 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20010 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20  ITE_OK;.  Btree 
20020 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
20030 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
20040 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
20050 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20060 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20070 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
20080 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
20090 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
200a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
200b0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
200c0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
200d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
200e0 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
200f0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
20100 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
20110 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
20120 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
20130 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
20140 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
20150 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  T ){.      retur
20160 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
20170 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20180 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
20190 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
201a0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
201b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
201c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
201d0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
201e0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
201f0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
20200 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
20210 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
20220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
20230 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
20240 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
20250 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
20260 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
20270 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29  Cur->apPage[0]))
20280 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
20290 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
202a0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
202b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
202c0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
202d0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  age = 0;..    /*
202e0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
202f0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
20300 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
20310 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
20320 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65   cursor.    ** e
20330 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
20340 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
20350 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
20360 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
20370 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  .    ** NULL, th
20380 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
20390 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
203a0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
203b0 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a  the case,.    **
203c0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
203d0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
203e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
203f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
20400 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
20410 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
20420 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
20430 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79   if( (pCur->pKey
20440 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e  Info==0)!=pCur->
20450 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
20460 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
20470 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20480 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
20490 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
204a0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
204b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
204c0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
204d0 6f 74 20 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  ot );.  pCur->ai
204e0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
204f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
20500 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
20510 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
20520 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
20530 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
20540 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
20550 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
20560 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
20570 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
20580 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
20590 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
205a0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
205b0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
205c0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
205d0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
205e0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
205f0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
20600 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
20610 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
20620 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
20630 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
20640 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
20650 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
20660 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
20670 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
20680 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
20690 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
206a0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
206b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
206c0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
206d0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
206e0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
206f0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
20700 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
20710 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
20720 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
20730 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
20740 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
20750 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
20760 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
20770 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
20780 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
20790 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
207a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
207b0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
207c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
207d0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
207e0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
207f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20800 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
20810 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20820 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20830 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
20840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
20850 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
20860 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20870 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
20880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
20890 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
208a0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
208b0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
208c0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
208d0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
208e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
208f0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
20900 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
20910 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20920 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
20930 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
20940 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
20950 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
20960 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
20970 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
20980 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
20990 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
209a0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
209b0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
209c0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
209d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
209e0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
209f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
20a00 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
20a10 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
20a20 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
20a30 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
20a40 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
20a50 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
20a60 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
20a70 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
20a80 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
20a90 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
20aa0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
20ab0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
20ac0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
20ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
20ae0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
20af0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
20b00 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
20b10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20b20 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
20b30 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
20b40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20b50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
20b60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20b70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20b80 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
20b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
20ba0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
20bb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20bc0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
20bd0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
20be0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
20bf0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
20c00 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
20c10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20c20 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
20c30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
20c40 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
20c50 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
20c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20c70 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
20c80 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
20c90 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
20ca0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
20cb0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
20cc0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
20cd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20ce0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
20cf0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
20d00 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
20d10 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
20d20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
20d30 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
20d40 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
20d50 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
20d60 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
20d70 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
20d80 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
20d90 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
20da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20db0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
20dc0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
20dd0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
20de0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20df0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
20e10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20e20 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
20e30 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
20e40 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
20e50 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
20e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20e70 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20e80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
20e90 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
20ea0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
20eb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
20ec0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
20ed0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
20ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
20ef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20f00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20f10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20f20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
20f30 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
20f40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
20f50 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
20f60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
20f70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
20f80 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20f90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
20fa0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
20fb0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20fc0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
20fd0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
20fe0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
20ff0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
21000 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
21010 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
21020 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
21030 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
21040 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
21050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21060 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
21070 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
21080 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21090 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
210a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
210b0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
210c0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
210d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
210e0 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
210f0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
21100 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
21110 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
21120 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
21130 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
21140 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
21150 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
21160 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
21170 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
21180 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
21190 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
211a0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
211b0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
211c0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
211d0 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
211e0 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
211f0 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
21200 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
21210 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21220 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
21230 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
21240 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
21250 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
21260 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
21270 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
21280 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
21290 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
212a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
212b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
212c0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
212d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
212e0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
212f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
21300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21320 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
21330 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
21340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21350 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21360 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21370 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
21380 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
21390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
213a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
213b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
213c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
213d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
213e0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
213f0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
21400 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
21410 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
21420 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21430 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
21440 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
21450 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
21460 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
21470 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
21480 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
21490 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
214a0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
214b0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
214c0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
214d0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
214e0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
214f0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
21500 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
21510 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
21520 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
21530 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
21540 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
21550 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
21560 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
21570 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
21580 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
21590 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
215a0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
215b0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
215c0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
215d0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
215e0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
215f0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
21600 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
21610 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
21620 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
21630 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
21640 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
21650 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
21660 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
21670 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
21680 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
21690 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
216a0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
216b0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
216c0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
216d0 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
216e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
216f0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
21700 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
21710 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
21720 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
21730 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
21740 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
21750 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
21760 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
21770 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
21780 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
21790 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
217a0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
217b0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
217c0 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
217d0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
217e0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
217f0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
21820 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
21830 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
21840 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
21850 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
21860 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
21870 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21880 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
21890 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
218a0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
218b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
218c0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
218d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
218e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
218f0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
21900 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
21910 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
21920 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
21930 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
21940 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
21950 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
21960 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
21970 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
21980 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
21990 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
219a0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
219b0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
219d0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
219e0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
219f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
21a00 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21a10 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21a30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
21a40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
21a50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
21a60 74 28 20 70 52 65 73 20 29 3b 0a 0a 20 20 2f 2a  t( pRes );..  /*
21a70 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
21a80 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
21a90 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
21aa0 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
21ab0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
21ac0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
21ad0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
21ae0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
21af0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21b00 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
21b10 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
21b20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
21b30 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
21b40 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
21b50 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
21b60 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
21b70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
21b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21b90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
21ba0 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
21bb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
21bc0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
21bd0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
21be0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21bf0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
21c00 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
21c10 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
21c20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
21c30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21c40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21c50 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
21c60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21c70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21c80 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
21c90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21ca0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21cb0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72  >nCell>0 || pCur
21cc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21cd0 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  _INVALID );.  if
21ce0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21cf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
21d00 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
21d10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21d20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21d30 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
21d40 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
21d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21d60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21d70 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
21d80 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
21d90 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
21da0 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
21db0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
21dc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
21dd0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
21de0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
21df0 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
21e00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
21e10 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
21e20 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
21e30 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
21e40 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
21e50 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
21e60 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
21e70 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
21e80 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
21e90 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
21ea0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
21eb0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
21ec0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
21ed0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
21ee0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
21ef0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
21f00 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
21f10 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
21f20 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 6c 77 72 20  ll>0 );.    lwr 
21f30 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
21f40 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
21f50 20 20 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e     if( (!pPage->
21f60 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65  intKey && pIdxKe
21f70 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
21f80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
21f90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
21fa0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
21fb0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  h;.    }.    if(
21fc0 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20   biasRight ){.  
21fd0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
21fe0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
21ff0 75 31 36 29 75 70 72 3b 0a 20 20 20 20 7d 65 6c  u16)upr;.    }el
22000 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
22010 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22020 65 5d 20 3d 20 28 75 31 36 29 28 28 75 70 72 2b  e] = (u16)((upr+
22030 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
22040 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
22050 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
22060 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22070 61 67 65 5d 3b 20 2f 2a 20 49 6e 64 65 78 20 6f  age]; /* Index o
22080 66 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69  f current cell i
22090 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 20 20 20  n pPage */.     
220a0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
220d0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
220e0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
220f0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
22100 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
22110 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
22120 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
22130 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
22140 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
22150 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
22160 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
22170 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
22180 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
22190 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
221a0 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
221b0 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
221c0 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
221d0 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
221e0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
221f0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
22200 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
22210 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
22220 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22230 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
22240 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
22250 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
22260 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
22270 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22280 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22290 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
222a0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
222b0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
222c0 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
222d0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
222e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
222f0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
22300 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
22310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
22320 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
22330 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 33 32   page-size is 32
22340 37 36 38 20 62 79 74 65 73 2e 20 54 68 69 73 20  768 bytes. This 
22350 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
22360 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
22370 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
22380 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
22390 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
223a0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
223b0 67 65 20 69 73 20 61 74 20 6d 6f 73 74 20 38 31  ge is at most 81
223c0 39 38 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  98 bytes, which 
223d0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
223e0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
223f0 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
22400 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
22410 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
22420 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
22430 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
22440 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
22450 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
22460 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
22470 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
22480 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
22490 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
224a0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
224b0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
224c0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
224d0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
224e0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
224f0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
22500 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
22510 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e  .        if( !(n
22520 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20  Cell & 0x80) && 
22530 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
22540 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
22550 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
22560 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
22570 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
22580 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
22590 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
225a0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
225b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
225c0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
225d0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
225e0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
225f0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
22600 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
22610 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
22620 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
22630 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
22640 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
22650 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
22660 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
22670 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
22680 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
22690 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
226a0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
226b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
226c0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
226d0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
226e0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
226f0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
22700 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
22710 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
22720 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
22730 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
22740 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
22750 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
22760 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
22770 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
22780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
227a0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
227b0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
227c0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
227d0 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
227e0 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
227f0 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
22800 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
22810 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
22820 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
22830 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
22840 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
22850 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
22860 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
22870 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
22880 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
22890 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
228a0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
228b0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
228c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
228d0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
228e0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
228f0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
22900 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
22910 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
22920 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
22930 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
22940 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
22950 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
22960 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
22970 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
22980 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
22990 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
229a0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
229b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
229c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
229d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
229e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
229f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22a00 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
22a10 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
22a20 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
22a30 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
22a40 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
22a50 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
22a60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
22a70 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
22a80 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
22a90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22aa0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
22ab0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
22ac0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
22ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22ae0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
22af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
22b00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
22b10 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
22b20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
22b30 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
22b40 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
22b50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
22b60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22b70 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
22b80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
22bb0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22bd0 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
22be0 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
22bf0 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
22c00 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
22c10 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
22c20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
22c30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
22c40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
22c50 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
22c60 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
22c70 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
22c80 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22c90 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
22ca0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22cb0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
22cc0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
22cd0 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
22ce0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
22cf0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
22d00 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
22d10 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
22d20 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
22d30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22d40 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
22d50 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
22d60 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
22d70 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
22d80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
22d90 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
22da0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22db0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22dc0 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
22dd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22de0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ll );.      *pRe
22df0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
22e00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22e10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
22e20 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
22e30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22e40 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22e50 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
22e60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22e70 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
22e80 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
22e90 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
22ea0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
22eb0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
22ec0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22ed0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
22ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22ef0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
22f00 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
22f10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
22f20 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
22f30 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
22f40 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
22f50 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
22f60 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
22f70 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
22f80 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
22f90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
22fa0 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
22fb0 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
22fc0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
22fd0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
22fe0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
22ff0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
23000 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
23010 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
23020 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23030 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
23040 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
23050 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
23060 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
23070 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
23080 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
23090 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
230a0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
230b0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
230c0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
230d0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
230e0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
230f0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
23100 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
23110 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
23120 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
23130 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
23140 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
23150 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
23160 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
23170 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
23180 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
23190 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
231a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
231b0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
231c0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
231d0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
231e0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
231f0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
23200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23210 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
23220 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
23230 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
23240 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
23250 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
23260 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23270 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23280 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
23290 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
232a0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
232b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
232c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
232d0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
232e0 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   );.  if( CURSOR
232f0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
23300 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
23310 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
23320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23330 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
23340 6b 69 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  kip>0 ){.    pCu
23350 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
23360 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
23370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23380 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
23390 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
233a0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
233b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
233c0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
233d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
233e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
233f0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
23400 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67  ssert( idx<=pPag
23410 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
23420 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23430 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
23440 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
23450 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
23460 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
23470 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23480 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23490 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
234a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
234b0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
234c0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
234d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
234e0 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
234f0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
23500 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
23510 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
23520 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23530 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
23540 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
23550 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
23560 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
23570 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23580 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
23590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
235a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
235b0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
235c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
235d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
235e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
235f0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
23600 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23610 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
23620 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
23630 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
23640 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
23650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23660 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
23670 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
23680 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
23690 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
236a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
236b0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
236c0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
236d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
236e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
236f0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
23700 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
23710 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
23720 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
23730 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
23740 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
23750 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
23760 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
23770 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
23780 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
23790 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
237a0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
237b0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
237c0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
237d0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
237e0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
237f0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
23800 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
23810 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
23820 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
23830 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
23840 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
23850 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
23860 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23870 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23880 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
23890 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
238a0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
238b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
238c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
238d0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
238e0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
238f0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
23900 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
23910 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
23920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
23930 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
23940 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p<0 ){.    pCur-
23950 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
23960 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
23970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23980 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
23990 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
239a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
239b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
239c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
239d0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
239e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
239f0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
23a00 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23a10 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
23a20 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
23a30 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
23a40 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
23a50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23a60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23a70 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
23a80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
23a90 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
23aa0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
23ab0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23ac0 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
23ad0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
23ae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
23af0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23b00 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
23b10 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23b20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
23b30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
23b40 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
23b50 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
23b60 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
23b70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
23b80 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
23b90 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   0;..    pCur->a
23ba0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23bb0 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
23bc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23bd0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
23be0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
23bf0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
23c00 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
23c10 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
23c20 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
23c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23c50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
23c60 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
23c70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23c80 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
23c90 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
23ca0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
23cb0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
23cc0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
23cd0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
23ce0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
23cf0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
23d00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
23d10 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
23d20 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
23d30 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
23d40 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
23d50 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
23d60 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
23d70 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
23d80 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
23d90 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
23da0 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
23db0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
23dc0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
23dd0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
23de0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
23df0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
23e00 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
23e10 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
23e20 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
23e30 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
23e40 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
23e50 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
23e60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
23e70 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
23e80 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
23e90 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
23ea0 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
23eb0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
23ec0 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29   then a (feeble)
23ed0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
23ee0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
23ef0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
23f00 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
23f10 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
23f20 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
23f30 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
23f40 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
23f50 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
23f60 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
23f70 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
23f80 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
23f90 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
23fa0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
23fb0 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74  ** If the "exact
23fc0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
23fd0 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61  ot 0, and the pa
23fe0 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79  ge-number nearby
23ff0 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77   exists .** anyw
24000 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
24010 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
24020 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20  s guarenteed to 
24030 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  be returned. Thi
24040 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65  s.** is only use
24050 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
24060 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20   databases when 
24070 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
24080 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
24090 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
240a0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
240b0 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d  red *pBt, .  Mem
240c0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a  Page **ppPage, .
240d0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a    Pgno *pPgno, .
240e0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20    Pgno nearby,. 
240f0 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d   u8 exact.){.  M
24100 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
24110 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
24120 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
24130 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
24140 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
24150 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
24160 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
24170 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
24180 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
24190 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
241a0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
241b0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
241c0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
241d0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
241e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
241f0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
24200 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24210 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
24220 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
24230 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
24240 6d 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  mxPage = pagerPa
24250 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
24260 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
24270 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
24280 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
24290 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
242a0 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
242b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
242c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
242d0 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
242e0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
242f0 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
24300 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
24310 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
24320 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
24330 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
24340 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
24350 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
24360 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
24370 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
24380 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
24390 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70  If the 'exact' p
243a0 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75  arameter was tru
243b0 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  e and a query of
243c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
243d0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
243e0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
243f0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
24400 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
24410 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
24420 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
24430 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
24440 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
24450 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
24460 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
24470 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78  ACUUM.    if( ex
24480 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d  act && nearby<=m
24490 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75  xPage ){.      u
244a0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61  8 eType;.      a
244b0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
244c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
244d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
244e0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
244f0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
24500 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
24510 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
24520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24530 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
24540 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
24550 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
24560 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  st = 1;.      }.
24570 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e        *pPgno = n
24580 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e  earby;.    }.#en
24590 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
245a0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
245b0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
245c0 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
245d0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
245e0 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
245f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
24600 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
24610 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
24620 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
24630 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24640 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
24650 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
24660 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
24670 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
24680 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
24690 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
246a0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
246b0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
246c0 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
246d0 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
246e0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
246f0 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
24700 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
24710 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
24720 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
24730 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
24740 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
24750 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20  is located..    
24760 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
24770 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
24780 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
24790 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
247a0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
247b0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
247c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
247d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
247e0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
247f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
24800 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
24810 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
24820 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
24830 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
24840 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29   iTrunk>mxPage )
24850 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
24860 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
24870 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
24880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
24890 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
248a0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
248b0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
248c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
248d0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
248e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
248f0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
24900 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
24910 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
24920 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
24930 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24940 20 6b 3d 3d 28 75 33 32 29 28 70 42 74 2d 3e 75   k==(u32)(pBt->u
24950 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
24960 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   );.      if( k=
24970 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
24980 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
24990 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
249a0 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
249b0 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
249c0 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
249d0 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
249e0 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
249f0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
24a00 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
24a10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
24a20 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
24a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
24a40 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
24a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24a60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24a70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
24a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
24a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
24aa0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24ab0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
24ac0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
24ad0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
24ae0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
24af0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
24b00 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
24b10 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
24b20 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
24b30 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
24b40 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
24b50 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
24b60 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
24b70 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
24b80 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
24b90 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
24ba0 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
24bb0 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
24bc0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
24bd0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
24be0 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
24bf0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
24c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24c10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24c20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24c30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
24c40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24c50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
24c60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
24c70 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
24c80 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
24c90 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
24ca0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
24cb0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
24cc0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
24cd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
24ce0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
24cf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
24d00 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
24d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24d20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
24d30 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
24d40 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
24d50 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
24d60 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
24d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24d80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
24d90 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24da0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
24db0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
24dc0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24dd0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
24de0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
24df0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24e00 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
24e10 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
24e20 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
24e30 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
24e40 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
24e50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24e60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24e70 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
24e80 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
24e90 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
24ea0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24ec0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
24ed0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
24ee0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
24ef0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
24f00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
24f10 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
24f20 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
24f30 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
24f40 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
24f50 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
24f60 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
24f70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24f80 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
24f90 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
24fa0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
24fb0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
24fc0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
24fd0 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
24fe0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
24ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25000 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
25010 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
25020 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
25030 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
25040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25050 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
25060 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
25070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
25080 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25090 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
250a0 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
250b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
250c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
250d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
250e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
250f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25110 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
25120 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
25130 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
25140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25150 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
25160 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
25170 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
25180 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25190 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
251a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
251b0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
251c0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
251d0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
251e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
251f0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
25200 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
25210 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
25220 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
25230 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
25240 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
25250 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
25260 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
25270 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
25280 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
25290 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
252a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
252b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
252c0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
252d0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
252e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
252f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
25300 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
25310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25320 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25330 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
25340 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
25350 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
25360 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25370 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25380 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25390 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
253a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
253b0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
253c0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
253d0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
253e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
253f0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
25400 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
25410 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
25420 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
25430 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
25440 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
25450 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
25460 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
25470 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
25480 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
25490 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
254a0 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
254b0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
254c0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
254d0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
254e0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
254f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25500 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
25510 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
25520 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
25530 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
25540 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
25550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25560 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
25570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
25580 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
25590 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
255a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
255b0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
255c0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
255d0 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  8]) - nearby;.  
255e0 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74          if( dist
255f0 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73  <0 ) dist = -dis
25600 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
25610 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
25620 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
25630 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26   d2 = get4byte(&
25640 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
25650 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
25660 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64      if( d2<0 ) d
25670 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20  2 = -d2;.       
25680 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
25690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
256a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
256c0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
256d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
256e0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
256f0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
25700 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
25710 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
25720 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
25730 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
25740 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
25750 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
25760 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
25770 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
25780 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25790 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
257a0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
257b0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
257c0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
257d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
257e0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
257f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25800 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
25810 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
25820 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
25830 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
25840 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
25850 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
25860 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
25870 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
25880 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
25890 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
258a0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
258b0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
258d0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
258e0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
258f0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
25900 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
25910 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
25920 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
25930 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
25940 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
25950 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25960 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
25970 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
25980 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25990 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
259a0 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b  writeable(pTrunk
259b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
259c0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
259d0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
259e0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
259f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
25a00 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
25a10 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
25a20 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
25a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
25a60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25a70 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
25a80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
25a90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25ab0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
25ac0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
25ad0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
25ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25af0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
25b00 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
25b10 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
25b20 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
25b30 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
25b40 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
25b50 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
25b60 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
25b70 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
25b80 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
25b90 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
25ba0 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
25bb0 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
25bc0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
25bd0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61    int nPage = pa
25be0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
25bf0 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
25c00 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20  nPage + 1;..    
25c10 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
25c20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25c30 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50  t) ){.      (*pP
25c40 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23  gno)++;.    }..#
25c50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
25c60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
25c70 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
25c80 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
25c90 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67  ISPAGE(pBt, *pPg
25ca0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  no) ){.      /* 
25cb0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
25cc0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
25cd0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
25ce0 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
25cf0 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
25d00 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
25d10 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
25d20 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
25d30 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
25d40 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
25d50 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
25d60 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
25d70 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
25d80 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
25d90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
25da0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
25db0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
25dc0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
25dd0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
25de0 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  e)\n", *pPgno));
25df0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a  .      assert( *
25e00 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
25e10 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
25e20 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
25e30 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
25e40 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a  Pgno, &pPg, 0);.
25e50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25e80 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
25e90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
25ea0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
25eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25ec0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
25ed0 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67   rc;.      (*pPg
25ee0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  no)++;.      if(
25ef0 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
25f00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
25f10 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d  ){ (*pPgno)++; }
25f20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
25f30 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
25f40 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
25f50 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
25f60 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
25f70 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
25f80 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
25f90 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
25fa0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
25fb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
25fc0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
25fd0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
25fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25ff0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
26000 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
26010 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
26020 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
26030 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
26040 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
26050 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
26060 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
26070 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
26080 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
26090 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
260a0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
260b0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
260c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
260d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
260e0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
260f0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
26100 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
26110 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26120 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
26130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26140 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
26150 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
26160 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
26170 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
26180 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
26190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
261a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
261b0 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
261c0 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
261d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
261e0 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
261f0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
26200 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
26210 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
26220 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
26230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
26240 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
26250 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
26260 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
26270 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
26280 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
26290 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
262a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
262b0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
262c0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
262d0 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
262e0 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
262f0 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
26300 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
26310 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
26320 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
26330 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
26340 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
26350 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
26360 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
26370 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
26380 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
26390 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
263a0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
263b0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
263c0 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
263d0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
263e0 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
263f0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
26400 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
26410 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
26420 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
26430 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
26440 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
26450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26460 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
26470 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
26480 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
26490 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
264a0 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
264b0 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
264c0 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
264d0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
264e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264f0 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
26500 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
26510 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26540 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
26550 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26570 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
26580 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
26590 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
265a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
265b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
265c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
265d0 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
265e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
265f0 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
26600 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
26610 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
26620 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
26630 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
26640 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
26650 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
26660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
26670 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
26680 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
26690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
266a0 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
266b0 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
266c0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
266d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
266e0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
266f0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
26700 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
26710 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
26720 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26730 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
26740 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26750 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
26760 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
26770 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
26780 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
26790 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
267a0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
267b0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
267c0 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
267d0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
267e0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
267f0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
26800 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67   */.  if( (!pPag
26810 65 20 26 26 20 28 72 63 20 3d 20 62 74 72 65 65  e && (rc = btree
26820 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
26830 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29  ge, &pPage, 0)))
26840 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20  .   ||          
26850 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50    (rc = sqlite3P
26860 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
26870 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a  >pDbPage)).  ){.
26880 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
26890 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d  e_out;.  }.  mem
268a0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
268b0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
268c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64  >pageSize);.#end
268d0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
268e0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
268f0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
26900 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
26910 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
26920 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
26930 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
26940 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
26950 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
26960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
26970 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
26980 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
26990 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
269a0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
269b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
269c0 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
269d0 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
269e0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
269f0 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
26a00 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
26a10 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
26a20 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
26a30 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
26a40 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
26a50 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
26a60 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
26a70 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
26a80 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
26a90 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
26aa0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
26ab0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
26ac0 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
26ad0 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
26ae0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
26af0 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
26b00 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
26b10 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
26b20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
26b30 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
26b40 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
26b50 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
26b60 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
26b70 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
26b80 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
26b90 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
26ba0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
26bb0 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
26bc0 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
26bd0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
26be0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
26bf0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
26c00 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
26c10 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
26c20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
26c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26c40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26c50 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
26c60 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
26c70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
26c80 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61  ]);.    if( nLea
26c90 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f<0 ){.      rc 
26ca0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26cb0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
26cc0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
26cd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
26ce0 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  eaf<pBt->usableS
26cf0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
26d00 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
26d10 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
26d20 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
26d30 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
26d40 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
26d50 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
26d60 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
26d70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
26d80 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
26d90 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
26da0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
26db0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
26dc0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
26dd0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
26de0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
26df0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
26e00 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
26e10 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
26e20 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
26e30 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
26e40 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
26e50 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
26e60 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
26e70 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
26e80 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
26e90 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
26ea0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
26eb0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
26ec0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
26ed0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
26ee0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
26ef0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
26f00 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
26f10 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
26f20 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
26f30 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61  ** we will conta
26f40 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  in to restrict t
26f50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
26f60 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
26f70 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
26f80 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
26f90 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
26fa0 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
26fb0 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
26fc0 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
26fd0 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
26fe0 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
26ff0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
27000 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
27010 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
27020 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
27030 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
27040 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
27050 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
27060 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27070 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
27080 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
27090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
270a0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
270b0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
270c0 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
270d0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
270e0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
270f0 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
27100 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
27110 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
27120 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
27130 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
27140 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
27150 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
27160 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
27170 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27180 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
27190 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
271a0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
271b0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
271c0 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
271d0 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
271e0 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
271f0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
27200 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
27210 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
27220 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
27230 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
27240 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
27250 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
27260 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
27270 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
27280 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
27290 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
272a0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
272b0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
272c0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
272d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
272e0 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
272f0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
27300 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
27310 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
27320 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
27330 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
27340 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
27350 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
27360 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
27370 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
27380 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
27390 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20 26  f(   ((!pPage) &
273a0 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 62 74  & (0 != (rc = bt
273b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
273c0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
273d0 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20  )))).     || (0 
273e0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
273f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
27400 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20 29  ->pDbPage))).  )
27410 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
27420 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
27430 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
27440 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
27450 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
27460 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
27470 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
27480 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
27490 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
274a0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
274b0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
274c0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
274d0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
274e0 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
274f0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
27500 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
27510 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
27520 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
27530 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
27540 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
27550 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
27560 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
27570 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
27580 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61 67    return freePag
27590 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
275a0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
275b0 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  o);.}../*.** Fre
275c0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
275d0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
275e0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
275f0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
27600 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
27610 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
27620 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
27630 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
27640 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
27650 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
27660 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
27670 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
27680 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
27690 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
276a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
276b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
276c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
276d0 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
276e0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
276f0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
27700 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
27710 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
27720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
27730 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
27740 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
27750 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
27760 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
27770 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
27780 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
27790 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
277a0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
277b0 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
277c0 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
277d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
277e0 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
277f0 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
27800 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
27810 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
27820 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
27830 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
27840 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
27850 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
27860 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
27870 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
27880 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
27890 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
278a0 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65  || ovflPgno>page
278b0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
278c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
278d0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
278e0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
278f0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
27900 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
27910 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
27920 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
27930 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
27940 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
27950 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
27960 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
27970 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
27980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27990 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
279a0 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
279b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
279c0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
279d0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
279e0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
279f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27a00 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27a10 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
27a20 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
27a30 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
27a40 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
27a50 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
27a60 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
27a70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
27a80 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27a90 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
27aa0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
27ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27ac0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
27ad0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
27ae0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
27af0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
27b00 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
27b10 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
27b20 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
27b30 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
27b40 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
27b50 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
27b60 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
27b70 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
27b80 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
27b90 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
27ba0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
27bb0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
27bc0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
27bd0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
27be0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
27bf0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
27c00 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
27c10 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
27c20 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
27c30 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
27c40 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
27c50 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
27c60 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
27c70 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
27c80 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
27c90 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
27ca0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
27cb0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
27cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
27cd0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
27ce0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
27cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27d00 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
27d10 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
27d20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27d30 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
27d40 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
27d50 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
27d60 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
27d70 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
27d80 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
27d90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
27da0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
27db0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
27dc0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27de0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
27df0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
27e00 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
27e10 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27e30 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
27e40 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
27e50 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
27e60 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
27e70 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
27e80 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
27e90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
27ea0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
27eb0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
27ec0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27ed0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
27ee0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
27ef0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
27f00 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
27f10 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
27f20 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
27f30 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
27f40 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
27f50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27f60 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
27f70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
27f80 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
27f90 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
27fa0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
27fb0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
27fc0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
27fd0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
27fe0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
27ff0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
28000 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
28010 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
28020 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
28030 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
28040 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
28050 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
28060 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28070 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
28080 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
28090 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
280a0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
280b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
280c0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
280d0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
280e0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
280f0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
28100 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
28110 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
28120 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
28130 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
28140 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
28150 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
28160 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
28170 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
28180 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
28190 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
281a0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
281b0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
281c0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
281d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
281e0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
281f0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
28200 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
28210 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
28220 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
28230 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
28240 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
28250 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
28260 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
28270 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
28280 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
28290 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
282a0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
282b0 69 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66  if( nKey>0x7ffff
282c0 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29  fff || pKey==0 )
282d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
282e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
282f0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
28300 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
28310 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
28320 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
28330 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
28340 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
28350 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
28360 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
28370 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
28380 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
28390 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
283a0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
283b0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
283c0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
283d0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
283e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
283f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28400 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
28410 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
28420 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
28430 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
28440 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
28450 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28460 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
28470 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
28480 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
28490 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
284a0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
284b0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
284c0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
284d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
284e0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
284f0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
28500 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
28510 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
28520 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
28530 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
28540 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
28550 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
28560 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
28570 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
28580 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
28590 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
285a0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
285b0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
285c0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
285d0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
285e0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
285f0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
28600 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
28610 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
28620 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
28630 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
28640 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
28650 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
28660 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
28670 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
28680 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
28690 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
286a0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
286b0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
286c0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
286d0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
286e0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
286f0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
28700 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
28710 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
28720 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
28730 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
28740 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
28750 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
28760 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
28770 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
28780 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
28790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
287a0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
287b0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
287c0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
287d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
287e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
287f0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
28800 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
28810 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20  Ptrmap);.       
28820 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28830 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
28840 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
28850 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
28860 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
28870 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
28880 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
28890 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
288a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
288b0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
288c0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
288d0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
288e0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
288f0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
28900 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
28910 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
28920 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
28930 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
28940 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
28950 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
28960 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28970 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
28980 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
28990 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
289a0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
289b0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
289c0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
289d0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
289e0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
289f0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
28a00 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
28a10 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
28a20 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
28a30 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
28a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
28a50 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28a60 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28a70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
28a80 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
28a90 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
28aa0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28ab0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
28ac0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
28ad0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
28ae0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
28af0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
28b00 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
28b10 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
28b20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
28b30 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
28b40 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
28b50 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
28b60 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
28b70 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
28b80 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
28b90 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
28ba0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
28bb0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
28bc0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
28bd0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
28be0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
28bf0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
28c00 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
28c10 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
28c20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
28c30 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
28c40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28c50 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
28c60 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
28c70 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
28c80 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
28c90 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
28ca0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
28cb0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
28cc0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
28cd0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
28ce0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
28cf0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
28d00 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
28d10 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
28d20 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
28d30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
28d40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
28d50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
28d60 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
28d70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
28d80 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
28d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
28da0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
28db0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
28dc0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
28dd0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
28de0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
28df0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
28e00 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
28e10 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
28e20 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
28e30 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
28e40 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
28e50 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
28e60 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
28e70 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
28e80 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
28e90 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
28ea0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
28eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28ec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
28ed0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
28ee0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
28ef0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
28f00 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
28f10 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
28f20 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
28f30 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
28f40 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
28f50 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
28f60 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
28f70 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
28f80 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
28f90 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
28fa0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
28fb0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
28fc0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
28fd0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
28fe0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
28ff0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
29000 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70  .static int drop
29010 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
29020 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
29030 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
29040 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29050 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
29060 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
29070 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
29080 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
29090 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
290a0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
290b0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
290c0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
290d0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
290e0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
290f0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
29100 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
29110 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
29120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
29130 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
29140 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
29150 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
29160 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
29170 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
29180 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
29190 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
291a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
291b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
291c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
291d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
291e0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
291f0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
29200 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
29210 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
29220 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
29230 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66  2byte(ptr);.  if
29240 28 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72  ( (pc<pPage->hdr
29250 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
29260 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20  >leaf?0:4)).    
29270 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65   || (pc+sz>pPage
29280 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29290 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
292a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
292b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
292c0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
292d0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
292e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
292f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
29300 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78  .  }.  for(i=idx
29310 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
29320 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
29330 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
29340 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
29350 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
29360 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
29370 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
29380 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29390 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
293a0 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
293b0 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65  nFree += 2;.  re
293c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
293d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
293e0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
293f0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
29400 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
29410 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
29420 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
29430 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
29440 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
29450 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
29460 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
29470 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
29480 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
29490 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
294a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
294b0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
294c0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
294d0 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
294e0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
294f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
29500 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
29510 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
29520 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
29530 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
29540 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
29550 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
29560 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
29570 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
29580 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
29590 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
295a0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
295b0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
295c0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
295d0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
295e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
295f0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
29600 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
29610 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
29620 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
29630 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
29640 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
29650 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
29660 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
29670 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
29680 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
29690 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
296a0 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
296b0 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
296c0 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
296d0 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
296e0 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
296f0 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
29700 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
29710 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
29720 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
29730 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
29740 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
29750 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
29760 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
29770 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
29780 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
29790 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
297a0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
297b0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
297c0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
297d0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
297e0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
297f0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
29800 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
29810 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
29820 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
29830 69 43 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20  iChild       /* 
29840 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
29850 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
29860 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
29870 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ue */.){.  int i
29880 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
29890 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
298a0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
298b0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
298c0 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
298d0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
298e0 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
298f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29900 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
29910 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
29920 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
29930 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
29940 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
29950 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
29960 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
29970 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
29980 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
29990 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
299a0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
299b0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
299c0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
299d0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
299e0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
299f0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
29a00 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
29a10 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
29a20 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
29a30 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69  n data[] */..  i
29a40 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
29a50 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
29a60 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
29a70 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
29a80 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
29ab0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
29ac0 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
29ad0 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a  ->pBt)<=5460 );.
29ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
29af0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
29b00 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
29b10 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
29b20 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
29b30 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
29b40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29b50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29b60 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
29b70 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
29b80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
29b90 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
29ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
29bb0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
29bc0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
29bd0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
29be0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
29bf0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
29c00 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
29c10 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
29c20 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
29c30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
29c40 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29c50 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
29c60 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
29c70 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
29c80 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
29c90 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
29ca0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
29cb0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
29cc0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
29cd0 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
29ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
29cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29d00 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
29d10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
29d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
29d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29d50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
29d60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29d70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
29d80 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
29d90 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
29da0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
29db0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
29dc0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
29dd0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
29de0 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
29df0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
29e00 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
29e10 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
29e20 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
29e30 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29e40 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
29e50 3d 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 69 66  =end+2 );.    if
29e60 28 20 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65  ( idx+sz > pPage
29e70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29e80 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
29e90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29ea0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
29eb0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
29ec0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
29ed0 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
29ee0 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
29ef0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
29f00 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
29f10 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28  -nSkip);.    if(
29f20 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
29f30 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
29f40 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
29f50 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65     }.    for(j=e
29f60 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  nd, ptr=&data[j]
29f70 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
29f80 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
29f90 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
29fa0 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
29fb0 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
29fc0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
29fd0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
29fe0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
29ff0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2a000 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2a010 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2a020 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a030 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2a040 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2a050 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2a060 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2a070 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2a080 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2a090 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2a0a0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2a0b0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2a0c0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2a0d0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2a0e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
2a0f0 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
2a100 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2a110 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  l);.    }.#endif
2a120 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2a130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a140 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
2a150 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
2a160 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
2a170 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
2a180 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
2a190 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
2a1a0 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
2a1b0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2a1c0 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
2a1d0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
2a1e0 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
2a1f0 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
2a200 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
2a210 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
2a220 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
2a230 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
2a240 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
2a250 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
2a260 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
2a270 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
2a280 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
2a290 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
2a2a0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
2a2b0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2a2c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a2d0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
2a2e0 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
2a2f0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
2a300 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
2a310 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
2a320 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2a330 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
2a340 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
2a350 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
2a360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a370 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
2a380 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
2a390 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
2a3a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
2a3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2a3c0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
2a3d0 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2a3e0 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
2a3f0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2a400 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
2a410 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
2a420 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2a430 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2a440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a450 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a460 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2a470 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2a480 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
2a490 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2a4a0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2a4b0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2a4c0 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
2a4d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2a4e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2a4f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2a500 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2a510 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2a520 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2a530 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2a540 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2a550 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2a560 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
2a570 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2a580 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2a590 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2a5a0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2a5b0 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2a5c0 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2a5d0 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2a5e0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2a5f0 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2a600 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
2a610 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
2a620 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
2a630 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
2a640 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
2a650 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
2a660 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
2a670 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2a680 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
2a690 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2a6a0 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
2a6b0 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2a6c0 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
2a6d0 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
2a6e0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2a6f0 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
2a700 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
2a710 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
2a720 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
2a730 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
2a740 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
2a750 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
2a760 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2a770 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
2a780 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2a790 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2a7a0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
2a7b0 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2a7c0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2a7d0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
2a7e0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
2a7f0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2a800 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2a810 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
2a820 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
2a830 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
2a840 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
2a850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
2a860 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
2a870 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
2a880 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
2a890 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
2a8a0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
2a8b0 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
2a8c0 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
2a8d0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
2a8e0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
2a8f0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
2a900 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
2a910 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2a920 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
2a930 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
2a940 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
2a950 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
2a960 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
2a970 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
2a980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a990 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2a9a0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2a9b0 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
2a9c0 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
2a9d0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
2a9e0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
2a9f0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
2aa00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2aa10 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
2aa20 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2aa30 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
2aa40 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
2aa50 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2aa60 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
2aa70 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
2aa80 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
2aa90 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
2aaa0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
2aab0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
2aac0 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
2aad0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2aae0 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
2aaf0 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
2ab00 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
2ab10 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
2ab20 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
2ab30 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
2ab40 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
2ab50 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
2ab60 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
2ab70 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
2ab80 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
2ab90 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
2aba0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
2abb0 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
2abc0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
2abd0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
2abe0 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
2abf0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
2ac00 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
2ac10 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
2ac20 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
2ac30 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
2ac40 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
2ac50 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
2ac60 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
2ac70 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
2ac80 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
2ac90 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
2aca0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
2acb0 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
2acc0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
2acd0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
2ace0 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
2acf0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
2ad00 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2ad10 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
2ad20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
2ad30 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
2ad40 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
2ad50 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
2ad60 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
2ad70 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
2ad80 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
2ad90 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
2ada0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2adb0 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
2adc0 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
2add0 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
2ade0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
2adf0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
2ae00 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
2ae10 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
2ae20 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
2ae30 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
2ae40 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
2ae50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ae60 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
2ae70 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2ae80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2ae90 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
2aea0 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
2aeb0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2aec0 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
2aed0 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
2aee0 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af00 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
2af10 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
2af20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2af30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af40 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2af50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2af60 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2af70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2af80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
2af90 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
2afa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2afb0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2afc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2afd0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2afe0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2aff0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2b000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b010 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2b020 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
2b030 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
2b040 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2b050 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
2b060 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2b070 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
2b080 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
2b090 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
2b0a0 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
2b0b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2b0c0 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
2b0d0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2b0e0 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
2b0f0 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
2b100 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
2b110 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
2b120 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
2b130 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
2b140 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2b150 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2b160 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
2b170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b180 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
2b190 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
2b1a0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
2b1b0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
2b1c0 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
2b1d0 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
2b1e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2b1f0 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
2b200 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2b210 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b220 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
2b230 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
2b240 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
2b250 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
2b260 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2b270 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
2b280 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
2b290 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2b2a0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
2b2b0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2b2c0 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
2b2d0 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
2b2e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2b2f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2b300 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2b310 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
2b320 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
2b330 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
2b340 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
2b350 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
2b360 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
2b370 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
2b380 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
2b390 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
2b3a0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
2b3b0 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
2b3c0 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
2b3d0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
2b3e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
2b3f0 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
2b400 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
2b410 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
2b420 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
2b430 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
2b440 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
2b450 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
2b460 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
2b470 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2b480 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
2b490 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
2b4a0 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
2b4b0 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
2b4c0 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
2b4d0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2b4e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2b4f0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2b500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2b510 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2b520 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
2b530 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2b540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
2b550 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
2b560 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  al && rc==SQLITE
2b570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2b580 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2b590 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
2b5a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b5b0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
2b5c0 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
2b5d0 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
2b5e0 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
2b5f0 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
2b600 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2b610 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
2b620 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
2b630 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
2b640 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
2b650 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
2b660 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
2b670 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
2b680 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
2b690 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
2b6a0 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
2b6b0 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
2b6c0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
2b6d0 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
2b6e0 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
2b6f0 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
2b700 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
2b710 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
2b720 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
2b730 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
2b740 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
2b750 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2b760 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
2b770 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
2b780 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
2b790 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
2b7a0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2b7b0 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
2b7c0 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
2b7d0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
2b7e0 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
2b7f0 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
2b800 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
2b810 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
2b820 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
2b830 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2b840 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
2b850 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
2b860 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2b870 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
2b880 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
2b890 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
2b8a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b8b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
2b8c0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2b8d0 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2b8e0 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
2b8f0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2b900 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
2b910 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2b920 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
2b930 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
2b940 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2b950 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
2b960 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
2b970 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2b980 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
2b990 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
2b9a0 61 72 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e  arent,pParent->n
2b9b0 43 65 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74  Cell,pSpace,(int
2b9c0 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30  )(pOut-pSpace),0
2b9d0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a  ,pPage->pgno);..
2b9e0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
2b9f0 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
2ba00 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
2ba10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
2ba20 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
2ba30 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2ba40 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2ba50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2ba60 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
2ba70 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
2ba80 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2ba90 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2baa0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2bab0 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
2bac0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2bad0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
2bae0 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
2baf0 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
2bb00 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2bb10 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
2bb20 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
2bb30 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
2bb40 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
2bb50 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
2bb60 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
2bb70 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
2bb80 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
2bb90 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
2bba0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
2bbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2bbc0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
2bbd0 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
2bbe0 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
2bbf0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
2bc00 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
2bc10 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
2bc20 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
2bc30 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
2bc40 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
2bc50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2bc60 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
2bc70 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2bc80 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
2bc90 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
2bca0 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
2bcb0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2bcc0 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
2bcd0 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
2bce0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
2bcf0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
2bd00 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2bd10 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
2bd20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2bd30 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
2bd40 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
2bd50 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
2bd60 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
2bd70 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2bd80 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
2bd90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2bda0 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
2bdb0 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
2bdc0 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
2bdd0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2bde0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2bdf0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
2be00 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
2be10 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2be20 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2be30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2be40 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2be50 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2be60 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
2be70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
2be80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2be90 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2bea0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2beb0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2bec0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2bed0 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
2bee0 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
2bef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bf00 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2bf10 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
2bf20 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
2bf30 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
2bf40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
2bf50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2bf60 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
2bf70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
2bf80 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
2bf90 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
2bfa0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2bfb0 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
2bfc0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
2bfd0 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
2bfe0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2bff0 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
2c000 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
2c010 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
2c020 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
2c030 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
2c040 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
2c050 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
2c060 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
2c070 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
2c080 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
2c090 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
2c0a0 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
2c0b0 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
2c0c0 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
2c0d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
2c0e0 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
2c0f0 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
2c100 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
2c110 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
2c120 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
2c130 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
2c140 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d   MemPage.aOvfl[]
2c150 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
2c160 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
2c170 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
2c180 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
2c190 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
2c1a0 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
2c1b0 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
2c1c0 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
2c1d0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
2c1e0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
2c1f0 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
2c200 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
2c210 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
2c220 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
2c230 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
2c240 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
2c250 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
2c260 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
2c270 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
2c280 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
2c290 63 20 69 6e 74 20 63 6f 70 79 4e 6f 64 65 43 6f  c int copyNodeCo
2c2a0 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70  ntent(MemPage *p
2c2b0 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70  From, MemPage *p
2c2c0 54 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  To){.  BtShared 
2c2d0 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
2c2e0 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 75 38 20 2a  rom->pBt;.  u8 *
2c2f0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
2c300 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 75  From->aData;.  u
2c310 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20  8 * const aTo = 
2c320 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e  pTo->aData;.  in
2c330 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
2c340 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
2c350 73 65 74 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74  set;.  int const
2c360 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
2c370 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
2c380 3a 20 30 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d  : 0);.  int rc =
2c390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2c3a0 74 20 69 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  t iData;..  asse
2c3b0 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
2c3c0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2c3d0 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f  From->nFree>=iTo
2c3e0 48 64 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Hdr );.  assert(
2c3f0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2c400 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70  [iFromHdr+5])<=p
2c410 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2c420 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
2c430 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2c440 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2c450 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2c460 2e 20 2a 2f 0a 20 20 69 44 61 74 61 20 3d 20 67  . */.  iData = g
2c470 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2c480 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 6d  FromHdr+5]);.  m
2c490 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61  emcpy(&aTo[iData
2c4a0 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d  ], &aFrom[iData]
2c4b0 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
2c4c0 65 2d 69 44 61 74 61 29 3b 0a 20 20 6d 65 6d 63  e-iData);.  memc
2c4d0 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c  py(&aTo[iToHdr],
2c4e0 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72   &aFrom[iFromHdr
2c4f0 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66  ], pFrom->cellOf
2c500 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e  fset + 2*pFrom->
2c510 6e 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65  nCell);..  /* Re
2c520 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20  initialize page 
2c530 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  pTo so that the 
2c540 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2c550 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
2c560 65 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65  e.  ** match the
2c570 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
2c580 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
2c590 20 70 54 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61   pTo "cannot" fa
2c5a0 69 6c 2c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  il, as the.  ** 
2c5b0 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d  data copied from
2c5c0 20 70 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20   pFrom is known 
2c5d0 74 6f 20 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f  to be valid.  */
2c5e0 0a 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d  .  pTo->isInit =
2c5f0 20 30 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 72   0;.  TESTONLY(r
2c600 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69 74 50  c = ) btreeInitP
2c610 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65  age(pTo);.  asse
2c620 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2c630 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
2c640 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2c650 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2c660 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2c670 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2c680 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
2c690 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
2c6a0 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
2c6b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2c6c0 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20  inters to. */.  
2c6d0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c6e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
2c6f0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
2c700 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c710 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2c720 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
2c730 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
2c740 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
2c750 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
2c760 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
2c770 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
2c780 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
2c790 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
2c7a0 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
2c7b0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
2c7c0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
2c7d0 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
2c7e0 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
2c7f0 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
2c800 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
2c810 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
2c820 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
2c830 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
2c840 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
2c850 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
2c860 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
2c870 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
2c880 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
2c890 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
2c8a0 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
2c8b0 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
2c8c0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
2c8d0 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
2c8e0 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
2c8f0 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
2c900 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
2c910 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
2c920 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
2c930 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2c940 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
2c950 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2c960 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
2c970 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
2c980 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
2c990 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
2c9a0 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
2c9b0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
2c9c0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
2c9d0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
2c9e0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2c9f0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
2ca00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
2ca10 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
2ca20 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
2ca30 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
2ca40 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
2ca50 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
2ca60 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
2ca70 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
2ca80 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
2ca90 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2caa0 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
2cab0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
2cac0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2cad0 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
2cae0 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
2caf0 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
2cb00 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
2cb10 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
2cb20 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
2cb30 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2cb40 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
2cb50 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
2cb60 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
2cb70 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2cb80 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
2cb90 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
2cba0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2cbb0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
2cbc0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
2cbd0 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
2cbe0 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
2cbf0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2cc00 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2cc10 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
2cc20 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
2cc30 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
2cc40 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
2cc50 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
2cc60 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
2cc70 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
2cc80 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
2cc90 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
2cca0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
2ccb0 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
2ccc0 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
2ccd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2cce0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
2ccf0 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
2cd00 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2cd10 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
2cd20 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2cd30 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
2cd40 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
2cd50 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70  to a.** buffer p
2cd60 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69  age-size bytes i
2cd70 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69  n size. If, in i
2cd80 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
2cd90 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
2cda0 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
2cdb0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  , the parent pag
2cdc0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
2cdd0 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
2cde0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
2cdf0 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73 20  ore the parents 
2ce00 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
2ce10 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
2ce20 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
2ce30 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
2ce40 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
2ce50 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2ce60 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
2ce70 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
2ce80 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
2ce90 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
2cea0 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
2ceb0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
2cec0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
2ced0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
2cee0 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
2cef0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2cf00 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
2cf10 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
2cf20 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
2cf30 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
2cf40 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
2cf50 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2cf60 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
2cf70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
2cf80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2cf90 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
2cfa0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2cfb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cfc0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
2cfd0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
2cfe0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
2cff0 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d010 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
2d020 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
2d030 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
2d040 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
2d050 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
2d060 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2d070 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
2d080 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
2d090 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d0a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d0b0 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
2d0c0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
2d0d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d0f0 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
2d100 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
2d110 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2d120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d130 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
2d140 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
2d150 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
2d160 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2d170 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
2d180 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
2d190 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
2d1a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d1b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d1c0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
2d1d0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
2d1e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d1f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d200 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
2d210 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
2d220 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
2d230 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d240 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
2d250 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2d260 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2d270 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2d280 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2d290 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2d2a0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2d2b0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2d2c0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
2d2d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2d2e0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2d2f0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2d300 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2d310 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d330 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2d340 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2d350 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2d360 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d380 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2d390 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2d3a0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2d3b0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2d3c0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2d3d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2d3e0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2d3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d400 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2d410 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2d420 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2d430 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d450 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2d460 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2d470 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
2d480 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
2d490 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2d4a0 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
2d4b0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
2d4c0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
2d4d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2d4e0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
2d4f0 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
2d500 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
2d510 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
2d520 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2d530 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
2d540 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
2d550 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
2d560 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
2d570 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
2d580 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2d590 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
2d5a0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2d5b0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
2d5c0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
2d5d0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
2d5e0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
2d5f0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2d600 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
2d610 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
2d620 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
2d630 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
2d640 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2d650 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2d660 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2d670 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2d680 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2d690 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2d6a0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2d6b0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2d6c0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2d6d0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2d6e0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2d6f0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2d700 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2d710 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d720 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2d730 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2d740 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2d750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d760 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2d770 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2d780 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2d790 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
2d7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2d7b0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2d7c0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
2d7d0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7f0 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
2d800 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
2d810 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
2d820 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
2d830 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d840 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2d850 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d860 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d870 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d880 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2d890 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
2d8a0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
2d8b0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
2d8c0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
2d8d0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
2d8e0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
2d8f0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2d900 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
2d910 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
2d920 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
2d930 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
2d940 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
2d950 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
2d960 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
2d970 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
2d980 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
2d990 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
2d9a0 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
2d9b0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
2d9c0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
2d9d0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
2d9e0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
2d9f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2da00 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2da10 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2da20 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2da30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2da40 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2da50 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2da60 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2da70 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2da80 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2da90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2daa0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2dab0 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2dac0 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2dad0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2dae0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2daf0 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2db00 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2db10 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2db20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2db30 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2db40 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2db50 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2db60 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2db70 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2db80 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2db90 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2dba0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2dbb0 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2dbc0 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2dbd0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2dbe0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2dbf0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2dc00 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2dc10 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2dc20 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2dc30 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2dc40 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2dc50 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2dc60 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2dc70 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2dc80 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2dc90 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2dca0 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2dcb0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2dcc0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2dcd0 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20  page, as if one 
2dce0 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20 61  existed it has a
2dcf0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
2dd00 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20   removed.  */.  
2dd10 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2dd20 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2dd30 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2dd40 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2dd50 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2dd60 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2dd70 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2dd80 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2dd90 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2dda0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2ddb0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2ddc0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2ddd0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2dde0 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2ddf0 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2de00 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2de10 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2de20 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2de30 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2de40 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2de50 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2de60 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2de70 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2de80 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2de90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2dea0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2deb0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2dec0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2ded0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2dee0 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2def0 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2df00 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2df10 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2df20 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2df30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2df40 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2df50 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65  , 0, i*sizeof(Me
2df60 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2df70 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2df80 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2df90 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2dfa0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2dfb0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2dfc0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2dfd0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2dfe0 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e     if( pParent->
2dff0 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e  nOverflow && i+n
2e000 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2e010 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20  Ovfl[0].idx ){. 
2e020 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2e030 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2e040 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2e050 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2e060 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2e070 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2e080 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2e090 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2e0a0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2e0b0 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2e0c0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2e0d0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2e0e0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2e0f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2e100 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2e110 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2e120 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2e130 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2e140 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2e150 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2e160 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2e170 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2e180 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2e190 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2e1a0 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2e1b0 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2e1c0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2e1d0 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2e1e0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2e1f0 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2e200 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2e210 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2e220 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2e230 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2e240 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2e250 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2e260 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2e270 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2e280 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2e290 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2e2a0 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2e2b0 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2e2c0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2e2d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2e2e0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2e2f0 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2e300 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2e310 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2e320 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2e330 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2e340 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2e350 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2e360 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2e370 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2e380 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2e390 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2e3a0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2e3b0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2e3c0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2e3d0 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2e3e0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2e3f0 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2e400 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2e410 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2e420 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2e430 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2e440 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2e450 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2e460 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2e470 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2e480 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2e490 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2e4a0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2e4b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2e4c0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2e4d0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2e4e0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2e4f0 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
2e500 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2e510 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2e520 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2e530 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2e540 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2e550 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2e560 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2e570 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2e580 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2e590 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2e5a0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
2e5b0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
2e5c0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
2e5d0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
2e5e0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2e5f0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2e600 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2e610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2e620 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2e630 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2e640 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2e650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2e660 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2e670 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2e6a0 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2e6b0 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e6e0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
2e6f0 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
2e700 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2e710 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2e720 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2e730 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2e740 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e750 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2e760 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2e770 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2e780 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2e790 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
2e7a0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2e7b0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2e7c0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2e7d0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2e7e0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
2e7f0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2e800 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2e810 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2e820 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2e830 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2e840 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2e850 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2e860 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2e870 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2e880 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2e890 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
2e8a0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2e8b0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2e8c0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2e8d0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2e8e0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2e8f0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2e900 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2e910 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2e920 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2e930 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2e940 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2e950 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2e960 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2e970 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2e980 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2e990 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2e9a0 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2e9b0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2e9c0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2e9d0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2e9e0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2e9f0 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2ea00 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2ea10 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2ea20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2ea30 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2ea40 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2ea50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2ea60 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2ea70 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2ea80 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2ea90 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2eaa0 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2eab0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2eac0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2ead0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2eae0 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
2eaf0 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
2eb00 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
2eb10 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
2eb20 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2eb30 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2eb40 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
2eb50 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
2eb60 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
2eb70 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
2eb80 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
2eb90 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
2eba0 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
2ebb0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2ebc0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2ebd0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2ebe0 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
2ebf0 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
2ec00 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
2ec10 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2ec20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
2ec30 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
2ec40 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2ec50 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
2ec60 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2ec70 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2ec80 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
2ec90 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
2eca0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2ecb0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2ecc0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2ecd0 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
2ece0 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
2ecf0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2ed00 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2ed10 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2ed20 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
2ed30 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2ed40 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2ed50 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2ed60 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2ed70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2ed80 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2ed90 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2eda0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2edb0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2edc0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2edd0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2ede0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2edf0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2ee00 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2ee10 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2ee20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
2ee30 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
2ee40 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
2ee50 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2ee60 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2ee70 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2ee80 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2ee90 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
2eea0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
2eeb0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
2eec0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2eed0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2eee0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2eef0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ef00 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
2ef10 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2ef20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
2ef30 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
2ef40 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2ef50 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2ef60 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2ef70 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2ef80 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
2ef90 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
2efa0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2efb0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
2efc0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
2efd0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
2efe0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
2eff0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2f000 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2f010 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
2f020 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
2f030 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
2f040 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2f050 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
2f060 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
2f070 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
2f080 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
2f090 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
2f0a0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
2f0b0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
2f0c0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
2f0d0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
2f0e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f0f0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2f100 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2f110 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2f120 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
2f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2f140 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
2f150 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
2f160 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
2f170 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
2f180 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
2f190 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f1a0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
2f1b0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2f1c0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
2f1d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
2f1e0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
2f1f0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
2f200 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
2f210 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
2f220 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
2f230 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2f240 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
2f250 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
2f260 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
2f270 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
2f280 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
2f290 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
2f2a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
2f2b0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
2f2c0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
2f2d0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
2f2e0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
2f2f0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
2f300 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
2f310 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
2f320 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
2f330 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
2f340 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
2f350 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
2f360 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
2f370 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
2f380 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2f390 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
2f3a0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
2f3b0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
2f3c0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
2f3d0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
2f3e0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
2f3f0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
2f400 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2f410 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
2f420 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2f430 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2f440 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
2f450 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
2f460 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
2f470 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
2f480 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2f490 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
2f4a0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
2f4b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2f4c0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
2f4d0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
2f4e0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
2f4f0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
2f500 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
2f510 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
2f520 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
2f530 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
2f540 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
2f550 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2f560 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
2f570 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
2f580 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
2f590 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
2f5a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f5b0 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63  UPT; goto balanc
2f5c0 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20  e_cleanup; }.   
2f5d0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
2f5e0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
2f5f0 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
2f600 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
2f610 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
2f620 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
2f630 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
2f640 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
2f650 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
2f660 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
2f670 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
2f680 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
2f690 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
2f6a0 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
2f6b0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2f6c0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
2f6d0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
2f6e0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
2f6f0 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
2f700 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
2f710 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
2f720 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
2f730 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
2f740 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
2f750 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
2f760 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
2f770 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
2f780 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
2f790 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
2f7a0 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
2f7b0 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
2f7c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
2f7d0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
2f7e0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
2f7f0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
2f800 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
2f810 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
2f820 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
2f830 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
2f840 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
2f850 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
2f860 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
2f870 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
2f880 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
2f890 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
2f8a0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
2f8b0 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f8d0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
2f8e0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
2f8f0 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
2f900 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
2f910 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2f920 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
2f930 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
2f940 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
2f950 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
2f960 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
2f970 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2f980 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
2f990 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
2f9a0 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
2f9b0 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
2f9c0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
2f9d0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
2f9e0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
2f9f0 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
2fa00 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
2fa10 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
2fa20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
2fa30 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
2fa40 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
2fa50 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
2fa60 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
2fa70 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
2fa80 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
2fa90 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
2faa0 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
2fab0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
2fac0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
2fad0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
2fae0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
2faf0 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
2fb00 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
2fb10 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
2fb20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
2fb30 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
2fb40 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
2fb50 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
2fb60 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
2fb70 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
2fb80 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
2fb90 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
2fba0 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
2fbb0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
2fbc0 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
2fbd0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2fbe0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2fbf0 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
2fc00 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
2fc10 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
2fc20 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
2fc30 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
2fc40 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
2fc50 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
2fc60 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
2fc70 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
2fc80 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
2fc90 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
2fca0 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
2fcb0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
2fcc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2fcd0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2fce0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
2fcf0 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
2fd00 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
2fd10 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2fd20 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
2fd30 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
2fd40 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
2fd50 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
2fd60 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
2fd70 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2fd80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fd90 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2fda0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2fdb0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
2fdc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2fdd0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2fde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fdf0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
2fe00 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
2fe10 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2fe20 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70   &pNew, &pgno, p
2fe30 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  gno, 0);.      i
2fe40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2fe50 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2fe60 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
2fe70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
2fe80 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  +;..      /* Set
2fe90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2fea0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2feb0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2fec0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53   */.      if( IS
2fed0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2fee0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2fef0 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
2ff00 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2ff10 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2ff20 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
2ff30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ff40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2ff50 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ff60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2ff80 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
2ff90 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
2ffa0 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
2ffb0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
2ffc0 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
2ffd0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2ffe0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2fff0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30000 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
30010 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
30020 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
30030 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
30040 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
30050 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
30060 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
30070 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
30080 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
30090 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
300a0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
300b0 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
300c0 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
300d0 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
300e0 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
300f0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
30100 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
30110 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
30120 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
30130 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
30140 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
30150 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
30160 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
30170 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
30180 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
30190 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
301a0 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
301b0 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
301c0 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
301d0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
301e0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
301f0 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
30200 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
30210 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
30220 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
30230 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
30240 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
30250 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
30260 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
30270 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
30280 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
30290 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  V = apNew[i]->pg
302a0 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  no;.    int minI
302b0 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
302c0 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
302d0 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b        if( apNew[
302e0 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e  j]->pgno<(unsign
302f0 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
30300 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
30310 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65       minV = apNe
30320 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[j]->pgno;.    
30330 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
30340 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
30350 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
30360 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
30370 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e    t = apNew[i]->
30380 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d  pgno;.      pT =
30390 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
303a0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
303b0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
303c0 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
303d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
303e0 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
303f0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
30400 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
30410 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
30420 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
30430 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
30440 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
30450 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
30460 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
30470 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
30480 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
30490 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
304a0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
304b0 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
304c0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
304d0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
304e0 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
304f0 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
30500 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
30510 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
30520 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30530 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
30540 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
30550 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
30560 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
30570 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
30580 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
30590 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
305a0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
305b0 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
305c0 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
305d0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
305e0 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
305f0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
30600 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
30610 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
30620 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
30630 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
30640 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
30650 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
30660 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
30670 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
30680 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
30690 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
306a0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
306b0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
306c0 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
306d0 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
306e0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
306f0 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
30700 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
30710 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
30720 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
30730 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
30740 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
30750 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
30760 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
30770 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
30780 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
30790 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
307a0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
307b0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
307c0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
307d0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
307e0 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
307f0 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
30800 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
30810 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
30820 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
30830 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
30840 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
30850 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
30860 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
30870 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
30880 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
30890 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
308a0 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
308b0 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
308c0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
308d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
308e0 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
308f0 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
30900 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
30910 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
30920 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
30930 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
30940 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
30950 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
30960 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
30970 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
30980 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
30990 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
309a0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
309b0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
309c0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
309d0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
309e0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
309f0 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
30a00 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
30a10 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
30a20 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
30a30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30a40 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
30a50 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
30a60 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
30a70 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
30a80 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
30a90 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
30aa0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
30ab0 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
30ac0 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
30ad0 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
30ae0 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
30af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30b00 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
30b10 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
30b20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
30b30 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
30b40 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
30b50 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
30b60 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
30b70 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
30b80 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
30b90 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
30ba0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
30bb0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
30bc0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
30bd0 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
30be0 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
30bf0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
30c00 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
30c10 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
30c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
30c30 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
30c40 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
30c50 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
30c60 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
30c70 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
30c80 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
30c90 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
30ca0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30cb0 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
30cc0 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
30cd0 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
30ce0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
30cf0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
30d00 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
30d10 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
30d20 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
30d30 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
30d40 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
30d50 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
30d60 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
30d70 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
30d80 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
30d90 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
30da0 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
30db0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
30dc0 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
30dd0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
30de0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
30df0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30e00 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
30e10 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
30e20 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
30e30 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
30e40 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
30e50 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
30e60 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
30e70 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
30e80 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
30e90 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
30ea0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
30eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30ec0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
30ed0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
30ee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30ef0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30f00 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
30f10 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
30f20 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
30f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
30f40 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
30f50 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
30f60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
30f70 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
30f80 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
30f90 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
30fa0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
30fb0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
30fc0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
30fd0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
30fe0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
30ff0 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
31000 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
31010 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
31020 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
31030 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
31040 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
31050 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
31060 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
31070 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
31080 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
31090 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
310a0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
310b0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
310c0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
310d0 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
310e0 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
310f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
31100 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
31110 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
31120 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
31130 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
31140 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
31150 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
31160 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
31170 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
31180 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
31190 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
311a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
311b0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
311c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
311d0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
311e0 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
311f0 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
31200 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31210 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
31220 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
31230 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
31240 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
31250 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
31260 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
31270 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
31280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
31290 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
312a0 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
312b0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
312c0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
312d0 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
312e0 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
312f0 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
31300 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
31310 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
31320 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
31330 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
31340 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
31350 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
31360 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
31370 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
31380 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
31390 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
313a0 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
313b0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
313c0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
313d0 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
313e0 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
313f0 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
31400 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
31410 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
31420 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f  (rc = copyNodeCo
31430 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
31440 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20  pParent)) ){.   
31450 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
31460 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20  (apNew[0]);.    
31470 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  }.  }else if( IS
31480 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31490 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
314a0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
314b0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
314c0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
314d0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
314e0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
314f0 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
31500 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
31510 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
31520 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
31530 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
31540 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
31550 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
31560 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
31570 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
31580 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
31590 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
315a0 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
315b0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
315c0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
315d0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
315e0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
315f0 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
31600 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
31610 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
31620 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
31630 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
31640 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
31650 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
31660 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
31670 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
31680 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
31690 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
316a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
316b0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
316c0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
316d0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
316e0 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
316f0 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
31700 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31710 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
31720 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
31730 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
31740 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
31750 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
31760 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
31770 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
31780 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
31790 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
317a0 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
317b0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
317c0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
317d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
317e0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
317f0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
31800 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
31810 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
31820 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
31830 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
31840 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
31850 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
31860 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
31870 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
31880 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
31890 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
318a0 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
318b0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
318c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
318d0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
318e0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
318f0 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
31900 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
31910 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
31920 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
31930 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
31940 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
31950 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
31960 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
31970 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
31980 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
31990 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
319a0 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
319b0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
319c0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
319d0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
319e0 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
319f0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
31a00 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
31a10 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
31a20 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
31a30 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
31a40 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
31a50 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
31a60 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
31a70 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
31a80 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
31a90 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
31aa0 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
31ab0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
31ac0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
31ad0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
31ae0 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
31af0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
31b00 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
31b10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
31b20 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
31b30 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
31b40 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
31b50 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
31b60 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
31b70 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
31b80 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
31b90 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
31ba0 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
31bb0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
31bc0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
31bd0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
31be0 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
31bf0 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
31c00 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
31c10 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
31c20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c40 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
31c50 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
31c60 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
31c90 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
31ca0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
31cb0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26  r(i=0; i<nCell &
31cc0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
31cd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
31ce0 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
31cf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
31d00 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
31d10 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
31d20 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
31d30 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
31d40 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
31d50 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
31d60 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
31d70 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
31d80 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
31d90 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
31da0 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
31db0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
31dc0 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
31dd0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
31de0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
31df0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
31e00 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
31e10 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
31e20 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
31e30 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
31e40 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
31e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
31e60 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
31e70 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
31e80 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
31e90 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
31ea0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
31eb0 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
31ec0 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
31ed0 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
31ee0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
31ef0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
31f00 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
31f10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31f20 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
31f30 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31f40 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
31f50 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
31f60 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
31f70 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
31f80 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
31f90 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
31fa0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
31fb0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31fc0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
31fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
31fe0 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
31ff0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
32000 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
32010 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
32020 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
32030 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
32040 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
32050 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
32060 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
32070 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
32080 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
32090 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
320a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
320b0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
320c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
320d0 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
320e0 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
320f0 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
32100 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
32110 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
32120 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
32130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
32140 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
32150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32170 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
32180 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
32190 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
321a0 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
321b0 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
321c0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
321d0 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
321e0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
321f0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
32200 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
32210 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
32220 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
32230 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
32240 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
32250 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
32260 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
32270 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
32280 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
32290 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
322a0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
322b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
322c0 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
322d0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
322e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
322f0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
32300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
32310 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
32320 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
32330 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
32340 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
32350 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32360 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
32370 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
32380 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32390 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
323a0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
323b0 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
323c0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
323d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
323e0 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
323f0 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
32400 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
32410 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65  LITE_OK && i<nNe
32420 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
32430 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
32440 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34 62  ..    pBt, get4b
32450 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
32460 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50  Data[8]), PTRMAP
32470 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d  _BTREE, apNew[i]
32480 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
32490 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
324a0 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
324b0 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
324c0 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
324d0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
324e0 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
324f0 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
32500 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
32510 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
32520 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
32530 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
32540 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
32550 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
32560 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
32570 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
32580 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
32590 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
325a0 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
325b0 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
325c0 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
325d0 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
325e0 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
325f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
32600 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
32610 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
32620 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
32630 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
32640 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
32650 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
32660 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
32670 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
32680 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
32690 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
326a0 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
326b0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
326c0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
326d0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
326e0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
326f0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
32700 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
32710 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
32720 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
32730 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
32740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
32750 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32760 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
32770 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
32780 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
32790 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
327a0 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
327b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
327c0 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
327d0 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
327e0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
327f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
32800 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
32810 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
32820 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
32830 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
32840 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
32850 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
32860 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
32870 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
32880 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
32890 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
328a0 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
328b0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
328c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
328d0 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
328e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
328f0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
32900 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
32910 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
32920 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
32930 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
32940 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
32950 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
32960 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
32970 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
32980 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
32990 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
329a0 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
329b0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
329c0 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
329d0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
329e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
329f0 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
32a00 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
32a10 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
32a20 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
32a30 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
32a40 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
32a50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
32a60 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
32a70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
32a80 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
32a90 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32aa0 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
32ab0 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
32ac0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
32ad0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
32ae0 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
32af0 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
32b00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
32b10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
32b30 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
32b40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
32b50 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
32b60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
32b70 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
32b80 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
32b90 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
32ba0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32bb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
32bc0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
32bd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
32be0 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
32bf0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
32c00 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
32c10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
32c20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32c30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
32c40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
32c50 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
32c60 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
32c70 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
32c80 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
32c90 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
32ca0 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
32cb0 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
32cc0 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
32cd0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
32ce0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
32cf0 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
32d00 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
32d10 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
32d20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
32d30 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
32d40 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
32d50 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
32d60 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32d70 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
32d80 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
32d90 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
32da0 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20  >pgno,0)).   || 
32db0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32dc0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
32dd0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29  (pRoot, pChild))
32de0 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41  .   || (ISAUTOVA
32df0 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20  CUUM && .       
32e00 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32e10 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
32e20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
32e30 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
32e40 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20  pgno))).  ){.   
32e50 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
32e60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32e70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
32e80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
32e90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32ea0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
32eb0 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
32ec0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32ed0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32ee0 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
32ef0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
32f00 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
32f10 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
32f20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
32f30 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
32f40 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
32f50 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
32f60 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
32f70 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
32f80 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
32f90 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
32fa0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
32fb0 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
32fc0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
32fd0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
32fe0 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
32ff0 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
33000 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
33010 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
33020 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
33030 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
33040 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
33050 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
33060 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
33070 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
33080 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
33090 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
330a0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
330b0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
330c0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
330d0 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
330e0 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
330f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33100 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
33110 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
33120 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
33130 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
33140 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
33150 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
33160 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
33170 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
33180 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
33190 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
331a0 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
331b0 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
331c0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
331d0 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
331e0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
331f0 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
33200 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
33210 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
33220 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
33230 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
33240 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
33250 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
33260 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
33270 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
33280 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
33290 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
332a0 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
332b0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
332c0 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
332d0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
332e0 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
332f0 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
33300 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
33310 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
33320 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
33330 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
33340 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
33350 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
33360 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
33370 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
33380 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
33390 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
333a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
333b0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
333c0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
333d0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
333e0 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
333f0 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
33400 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
33410 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
33420 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
33430 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
33440 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
33450 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
33460 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
33470 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
33480 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
33490 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
334a0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
334b0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
334c0 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
334d0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
334e0 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
334f0 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
33500 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
33510 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33520 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
33530 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
33540 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
33550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33570 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
33580 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
33590 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
335a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
335b0 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
335c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
335d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
335e0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
335f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
33600 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
33610 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
33620 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
33630 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
33640 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
33650 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
33660 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
33670 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
33680 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
33690 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
336a0 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
336b0 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
336c0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
336d0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
336e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
336f0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
33700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
33720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33730 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
33740 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33750 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
33760 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
33770 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
33780 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
33790 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
337a0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
337b0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
337c0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
337d0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
337e0 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
337f0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
33800 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
33810 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
33820 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
33830 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
33840 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
33850 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
33860 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
33870 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
33880 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
33890 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
338a0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
338b0 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
338c0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
338d0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
338e0 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
338f0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
33900 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
33910 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
33920 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
33930 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
33940 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
33950 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
33960 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
33970 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
33980 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
33990 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
339a0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
339b0 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
339c0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
339d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
339e0 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
339f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
33a00 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
33a10 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
33a20 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
33a30 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
33a40 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
33a50 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
33a60 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
33a70 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
33a80 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
33a90 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
33aa0 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
33ab0 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
33ac0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
33ad0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33ae0 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
33af0 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
33b00 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
33b10 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
33b20 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
33b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
33b40 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
33b50 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
33b60 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33b70 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
33b80 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
33b90 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
33ba0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
33bb0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
33bc0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
33bd0 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
33be0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
33bf0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
33c00 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
33c10 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
33c20 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
33c30 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
33c40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
33c50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
33c60 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
33c70 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
33c80 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
33c90 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
33ca0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
33cb0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
33cc0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
33cd0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
33ce0 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
33cf0 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
33d00 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
33d10 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
33d20 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
33d30 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
33d40 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
33d50 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
33d60 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
33d70 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
33d80 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
33d90 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
33da0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
33db0 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
33dc0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
33dd0 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
33de0 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
33df0 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
33e00 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33e10 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
33e20 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
33e30 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
33e40 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
33e50 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
33e60 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
33e70 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
33e80 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
33e90 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
33ea0 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
33eb0 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
33ec0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33ed0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
33ee0 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
33ef0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
33f00 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
33f10 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
33f20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
33f30 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
33f40 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33f50 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
33f60 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
33f70 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
33f80 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
33f90 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
33fa0 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
33fb0 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
33fc0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
33fd0 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
33fe0 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
33ff0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
34000 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
34010 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
34020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
34030 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
34040 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
34050 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
34060 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
34070 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
34080 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
34090 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
340a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
340b0 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
340c0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
340d0 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
340e0 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
340f0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
34100 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
34110 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
34120 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
34130 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
34140 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
34150 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
34160 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
34170 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
34180 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
34190 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
341a0 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
341b0 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
341c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
341d0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
341e0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
341f0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
34200 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
34210 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
34220 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
34230 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
34240 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
34250 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
34260 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
34270 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
34280 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
34290 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
342a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
342b0 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
342c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
342d0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
342e0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
342f0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
34300 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
34310 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
34320 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
34330 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
34340 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
34350 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
34360 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
34370 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
34380 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
34390 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
343a0 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
343b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
343c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
343d0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
343e0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
343f0 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
34400 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
34410 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
34420 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
34430 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
34440 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
34450 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
34460 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
34470 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
34480 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
34490 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
344a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
344b0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
344c0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
344d0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
344e0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
344f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
34500 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
34510 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
34520 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
34530 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
34540 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
34550 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
34560 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
34570 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
34580 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
34590 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
345a0 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55  ll to.** MovetoU
345b0 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65  npacked() to see
345c0 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f  k cursor pCur to
345d0 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61   (pKey, nKey) ha
345e0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
345f0 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65  n performed. see
34600 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73  kResult is the s
34610 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74  earch result ret
34620 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76  urned (a negativ
34630 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70  e.** number if p
34640 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
34650 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73   entry that is s
34660 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65  maller than (pKe
34670 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20  y, nKey), or.** 
34680 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
34690 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
346a0 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20  at an etry that 
346b0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a  is larger than .
346c0 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29  ** (pKey, nKey))
346d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
346e0 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
346f0 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
34700 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 20  cursor pCur may 
34710 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a 2a  point to any .**
34720 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20   entry or to no 
34730 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49 6e  entry at all. In
34740 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
34750 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
34760 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73  seek.** the curs
34770 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65  or before the ne
34780 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73  w key can be ins
34790 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
347a0 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74  lite3BtreeInsert
347b0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
347c0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
347d0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74     /* Insert dat
347e0 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65  a into the table
347f0 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   of this cursor 
34800 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
34810 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
34820 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f      /* The key o
34830 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
34840 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
34850 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
34860 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61  ta,  /* The data
34870 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
34880 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  rd */.  int nZer
34890 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
348a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
348b0 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65   of extra 0 byte
348c0 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64  s to append to d
348d0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70  ata */.  int app
348e0 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20 20  endBias,        
348f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34900 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c  if this is likel
34910 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20  y an append */. 
34920 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20   int seekResult 
34930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34940 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69  /* Result of pri
34950 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  or MovetoUnpacke
34960 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20  d() call */.){. 
34970 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
34980 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b  oc = seekResult;
34990 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20  .  int szNew;.  
349a0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
349b0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72  ge *pPage;.  Btr
349c0 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
349d0 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
349e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
349f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34a00 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69  *oldCell;.  unsi
34a10 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65  gned char *newCe
34a20 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
34a30 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
34a40 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
34a50 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
34a60 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
34a70 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
34a80 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
34a90 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
34aa0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a  pCur->wrFlag );.
34ab0 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
34ac0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
34ad0 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  k(p, pCur->pgnoR
34ae0 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49  oot, pCur->pKeyI
34af0 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20  nfo!=0, 2) );.. 
34b00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
34b10 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61 20  n insert into a 
34b20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e  table b-tree, in
34b30 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
34b40 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73  rblob .  ** curs
34b50 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
34b60 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61 63  row being replac
34b70 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68 69  ed (assuming thi
34b80 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a 20  s is a replace. 
34b90 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20   ** operation - 
34ba0 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  if it is not, th
34bb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
34bc0 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69   no-op).  */.  i
34bd0 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
34be0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
34bf0 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
34c00 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70  rsors(p, pCur->p
34c10 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 30  gnoRoot, nKey, 0
34c20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
34c30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34c40 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
34c50 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
34c60 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
34c70 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
34c80 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
34c90 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
34ca0 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  s table..  **.  
34cb0 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  ** In some cases
34cc0 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62 74  , the call to bt
34cd0 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f  reeMoveto() belo
34ce0 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f  w is a no-op. Fo
34cf0 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  r.  ** example, 
34d00 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
34d10 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ata into a table
34d20 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72   with auto-gener
34d30 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a  ated integer.  *
34d40 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45  * keys, the VDBE
34d50 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73   layer invokes s
34d60 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
34d70 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
34d80 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65  the .  ** intege
34d90 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74  r key to use. It
34da0 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73   then calls this
34db0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74   function to act
34dc0 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65  ually insert the
34dd0 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f   .  ** data into
34de0 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72   the intkey B-Tr
34df0 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ee. In this case
34e00 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 72   btreeMoveto() r
34e10 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74  ecognizes.  ** t
34e20 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
34e30 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65 20  s already where 
34e40 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
34e50 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  nd returns witho
34e60 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e  ut.  ** doing an
34e70 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64  y work. To avoid
34e80 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73 65   thwarting these
34e90 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20   optimizations, 
34ea0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a  it is important.
34eb0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61    ** not to clea
34ec0 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65 72  r the cursor her
34ed0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20 20  e..  */.  if(.  
34ee0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
34ef0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
34f00 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
34f10 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
34f20 20 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53 51   (!loc &&.    SQ
34f30 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
34f40 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
34f50 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
34f60 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
34f70 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e    )){.    return
34f80 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
34f90 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
34fa0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
34fb0 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d   (pCur->eState==
34fc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26  CURSOR_INVALID &
34fd0 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61  & loc) );..  pPa
34fe0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
34ff0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
35000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35010 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
35020 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
35030 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
35040 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
35050 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
35060 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
35070 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
35080 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
35090 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
350a0 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
350b0 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
350c0 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
350d0 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
350e0 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
350f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35100 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
35110 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
35120 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
35130 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
35140 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
35150 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
35160 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
35170 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
35180 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
35190 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
351a0 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
351b0 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
351c0 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
351d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
351e0 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
351f0 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
35200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
35210 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
35220 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
35230 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
35240 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
35250 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75   loc==0 ){.    u
35260 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
35270 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d  sert( idx<pPage-
35280 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
35290 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
352a0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
352b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
352c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
352d0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
352e0 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
352f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
35300 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
35310 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35320 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
35330 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
35340 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
35350 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
35360 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
35370 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
35380 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
35390 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
353a0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
353b0 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
353c0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
353d0 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72  zOld);.    if( r
353e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  c!=SQLITE_OK ) {
353f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
35400 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
35410 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
35420 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
35430 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
35440 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
35450 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
35460 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
35470 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
35480 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35490 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
354a0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
354b0 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43  pPage, idx, newC
354c0 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
354d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
354e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
354f0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
35500 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35510 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
35520 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
35530 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
35540 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
35550 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
35560 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
35570 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
35580 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
35590 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
355a0 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
355b0 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
355c0 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
355d0 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
355e0 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
355f0 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
35600 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
35610 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
35620 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
35630 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
35640 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
35650 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
35660 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
35670 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
35680 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
35690 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
356a0 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
356b0 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
356c0 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
356d0 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
356e0 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
356f0 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
35700 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
35710 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
35720 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
35730 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
35740 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
35750 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
35760 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
35770 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
35780 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
35790 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
357a0 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
357b0 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
357c0 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
357d0 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
357e0 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
357f0 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
35800 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
35810 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
35820 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
35830 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
35840 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
35850 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
35860 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
35870 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
35880 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
35890 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
358a0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
358b0 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
358c0 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
358d0 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
358e0 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
358f0 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
35900 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
35910 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
35920 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
35930 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
35940 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
35950 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
35960 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
35970 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
35980 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
35990 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
359a0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
359b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
359c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
359d0 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
359e0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
359f0 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
35a00 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
35a10 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
35a20 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
35a30 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
35a40 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
35a50 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
35a60 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
35a70 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
35a80 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
35a90 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
35aa0 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
35ab0 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
35ac0 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
35ad0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
35ae0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
35af0 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
35b00 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
35b10 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
35b20 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
35b30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
35b40 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35b50 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
35b60 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
35b70 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
35b80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
35b90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
35ba0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
35bb0 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
35bc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
35bd0 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
35be0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
35bf0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
35c00 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
35c10 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
35c20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
35c30 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
35c40 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
35c50 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
35c60 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
35c70 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
35c80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35c90 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
35ca0 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35cd0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35ce0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d00 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
35d10 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
35d20 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
35d30 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
35d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35d50 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
35d60 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
35d70 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
35d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d90 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
35da0 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
35db0 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
35dc0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
35dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
35de0 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
35df0 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
35e00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
35e10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
35e20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
35e30 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
35e40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
35e50 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
35e60 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
35e70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
35e80 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
35e90 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
35ea0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
35eb0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
35ec0 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
35ed0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
35ee0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
35ef0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35f00 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
35f10 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
35f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
35f30 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
35f40 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
35f50 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
35f60 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
35f70 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
35f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35f90 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
35fa0 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
35fb0 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
35fc0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
35fd0 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
35fe0 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
35ff0 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
36000 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
36010 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
36020 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
36030 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
36040 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
36050 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
36060 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
36070 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
36080 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
36090 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e  noRoot, pCur->in
360a0 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  fo.nKey, 0);.  }
360b0 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d  ..  iCellDepth =
360c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
360d0 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d  iCellIdx = pCur-
360e0 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74  >aiIdx[iCellDept
360f0 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  h];.  pPage = pC
36100 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c  ur->apPage[iCell
36110 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20  Depth];.  pCell 
36120 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
36130 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20  , iCellIdx);..  
36140 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  /* If the page c
36150 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
36160 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73  try to delete is
36170 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
36180 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  , move.  ** the 
36190 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
361a0 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
361b0 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20  he tree that is 
361c0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a  smaller than.  *
361d0 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e  * the entry bein
361e0 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
361f0 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63  cell will replac
36200 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  e the cell being
36210 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72   deleted.  ** fr
36220 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
36230 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69  node. The 'previ
36240 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73  ous' entry is us
36250 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  ed for this inst
36260 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ead.  ** of the 
36270 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73  'next' entry, as
36280 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
36290 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20  try is always a 
362a0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
362b0 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
362c0 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61   by the child pa
362d0 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62  ge of the cell b
362e0 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68  eing deleted. Th
362f0 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61  is makes.  ** ba
36300 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65  lancing the tree
36310 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
36320 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
36330 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66  easier.  */.  if
36340 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
36350 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
36360 64 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  d;.    if( SQLIT
36370 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
36380 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
36390 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  (pCur, &notUsed)
363a0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
363b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
363c0 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
363d0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
363e0 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
363f0 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
36400 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b   before.  ** mak
36410 69 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61  ing any modifica
36420 74 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20  tions. Make the 
36430 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
36440 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20  the entry to be 
36450 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72  .  ** deleted wr
36460 69 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65  itable. Then fre
36470 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
36480 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
36490 77 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65  with the .  ** e
364a0 6e 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ntry and finally
364b0 20 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c   remove the cell
364c0 20 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74   itself from wit
364d0 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 0a  hin the page.  .
364e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65    */.  rc = save
364f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
36500 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
36510 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
36520 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
36530 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36540 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
36550 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
36560 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
36570 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
36580 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
36590 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
365a0 63 3b 0a 20 20 72 63 20 3d 20 64 72 6f 70 43 65  c;.  rc = dropCe
365b0 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
365c0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
365d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
365e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
365f0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  n rc;..  /* If t
36600 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
36610 77 61 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20  was not located 
36620 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  on a leaf page, 
36630 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a  then the cursor.
36640 20 20 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c    ** is currentl
36650 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
36660 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20  e largest entry 
36670 69 6e 20 74 68 65 20 73 75 62 2d 74 72 65 65 20  in the sub-tree 
36680 68 65 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74  headed.  ** by t
36690 68 65 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66  he child-page of
366a0 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77   the cell that w
366b0 61 73 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20  as just deleted 
366c0 66 72 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c  from an internal
366d0 0a 20 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20  .  ** node. The 
366e0 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65  cell from the le
366f0 61 66 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f  af node needs to
36700 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
36710 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e   internal.  ** n
36720 6f 64 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74  ode to replace t
36730 68 65 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e  he deleted cell.
36740 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67    */.  if( !pPag
36750 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d  e->leaf ){.    M
36760 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20  emPage *pLeaf = 
36770 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
36780 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
36790 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67  nt nCell;.    Pg
367a0 6e 6f 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50  no n = pCur->apP
367b0 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31  age[iCellDepth+1
367c0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73  ]->pgno;.    uns
367d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70  igned char *pTmp
367e0 3b 0a 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  ;..    pCell = f
367f0 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70  indCell(pLeaf, p
36800 4c 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Leaf->nCell-1);.
36810 20 20 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c      nCell = cell
36820 53 69 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70  SizePtr(pLeaf, p
36830 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  Cell);.    asser
36840 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  t( MX_CELL_SIZE(
36850 70 42 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a  pBt)>=nCell );..
36860 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
36870 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
36880 70 54 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70  pTmp = pBt->pTmp
36890 53 70 61 63 65 3b 0a 0a 20 20 20 20 72 63 20 3d  Space;..    rc =
368a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
368b0 74 65 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67  te(pLeaf->pDbPag
368c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
368d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
368e0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
368f0 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c  pPage, iCellIdx,
36900 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c 2b   pCell-4, nCell+
36910 34 2c 20 70 54 6d 70 2c 20 6e 29 3b 0a 20 20 20  4, pTmp, n);.   
36920 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
36930 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 64 72   rc;.    rc = dr
36940 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c  opCell(pLeaf, pL
36950 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43  eaf->nCell-1, nC
36960 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
36970 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
36980 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20  }..  /* Balance 
36990 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65  the tree. If the
369a0 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77   entry deleted w
369b0 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
369c0 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20  leaf page,.  ** 
369d0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
369e0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  still points to 
369f0 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68  that page. In th
36a00 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73  is case the firs
36a10 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  t.  ** call to b
36a20 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73  alance() repairs
36a30 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74   the tree, and t
36a40 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69  he if(...) condi
36a50 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76  tion is.  ** nev
36a60 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20  er true..  **.  
36a70 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
36a80 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
36a90 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74  ed was on an int
36aa0 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c  ernal node page,
36ab0 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20   then.  ** pCur 
36ac0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  is pointing to t
36ad0 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  he leaf page fro
36ae0 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77  m which a cell w
36af0 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20  as removed to.  
36b00 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63  ** replace the c
36b10 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d  ell deleted from
36b20 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
36b30 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67  de. This is slig
36b40 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79  htly.  ** tricky
36b50 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64   as the leaf nod
36b60 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75  e may be underfu
36b70 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65  ll, and the inte
36b80 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20  rnal node may.  
36b90 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64  ** be either und
36ba0 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20  er or overfull. 
36bb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e  In this case run
36bc0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61   the balancing a
36bd0 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e  lgorithm.  ** on
36be0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66   the leaf node f
36bf0 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c  irst. If the bal
36c00 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61  ance proceeds fa
36c10 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a  r enough up the.
36c20 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77    ** tree that w
36c30 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68  e can be sure th
36c40 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69  at any problem i
36c50 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
36c60 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65  ode has.  ** bee
36c70 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20  n corrected, so 
36c80 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  be it. Otherwise
36c90 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  , after balancin
36ca0 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c  g the leaf node,
36cb0 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63  .  ** walk the c
36cc0 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65  ursor up the tre
36cd0 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  e to the interna
36ce0 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e  l node and balan
36cf0 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77  ce it as .  ** w
36d00 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ell.  */.  rc = 
36d10 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20  balance(pCur);. 
36d20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36d30 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  OK && pCur->iPag
36d40 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a  e>iCellDepth ){.
36d50 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
36d60 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36d70 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  h ){.      relea
36d80 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
36d90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
36da0 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  -]);.    }.    r
36db0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
36dc0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
36dd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
36de0 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
36df0 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
36e00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
36e10 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
36e20 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
36e30 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
36e40 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
36e50 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
36e60 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
36e70 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
36e80 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
36e90 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
36ea0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
36eb0 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
36ec0 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
36ed0 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
36ee0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
36ef0 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
36f00 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
36f10 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
36f20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
36f30 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
36f40 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
36f50 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
36f60 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
36f70 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
36f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
36f90 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
36fa0 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
36fb0 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
36fc0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36fd0 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
36fe0 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
36ff0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
37000 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
37010 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
37020 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
37030 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37040 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
37050 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
37060 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
37070 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
37080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42  );.  assert( !pB
37090 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a  t->readOnly );..
370a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
370b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
370c0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
370d0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
370e0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
370f0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
37100 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
37110 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
37120 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37130 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
37140 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d  oMove;      /* M
37150 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20  ove a page here 
37160 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
37170 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a   the root-page *
37180 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
37190 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65  PageMove; /* The
371a0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
371b0 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65  . */..    /* Cre
371c0 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
371d0 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72  e may probably r
371e0 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
371f0 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61   existing databa
37200 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  se.    ** to mak
37210 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e  e room for the n
37220 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70  ew tables root p
37230 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69  age. In case thi
37240 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20  s page turns.   
37250 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e   ** out to be an
37260 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
37270 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66  delete all overf
37280 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63  low page-map cac
37290 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20  hes.    ** held 
372a0 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  by open cursors.
372b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61  .    */.    inva
372c0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
372d0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20  wCache(pBt);..  
372e0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61    /* Read the va
372f0 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66  lue of meta[3] f
37300 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
37310 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
37320 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  ere the.    ** r
37330 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
37340 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  new table should
37350 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20   go. meta[3] is 
37360 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
37370 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65  -page.    ** cre
37380 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20  ated so far, so 
37390 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
373a0 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29  e is (meta[3]+1)
373b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
373c0 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
373d0 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45 53  (p, BTREE_LARGES
373e0 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70 67  T_ROOT_PAGE, &pg
373f0 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67 6e  noRoot);.    pgn
37400 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
37410 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
37420 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
37430 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
37440 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
37450 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
37460 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
37470 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
37480 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
37490 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
374a0 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
374b0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
374c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
374d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
374e0 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
374f0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
37500 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
37510 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
37520 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
37530 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
37540 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
37550 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
37560 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
37570 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
37580 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
37590 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
375a0 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
375b0 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
375c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
375d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
375e0 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
375f0 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
37600 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
37610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
37630 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
37640 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
37650 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
37660 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
37670 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
37680 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
37690 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
376a0 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
376b0 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
376c0 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
376d0 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
376e0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
376f0 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
37700 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
37710 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
37720 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
37730 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
37740 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
37750 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
37760 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
37770 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
37780 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
37790 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
377a0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
377b0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
377c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
377d0 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
377e0 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
377f0 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
37800 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
37810 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
37820 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
37830 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
37840 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
37850 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
37860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37880 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
37890 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
378a0 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
378b0 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
378c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
378d0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
378e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
378f0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
37900 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
37910 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37920 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
37930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37940 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37950 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
37960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37970 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
37980 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
37990 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
379a0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
379b0 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e!=PTRMAP_FREEPA
379c0 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  GE );.      rc =
379d0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
379e0 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65 2c  t, pRoot, eType,
379f0 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f 4d   iPtrPage, pgnoM
37a00 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ove, 0);.      r
37a10 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37a20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
37a30 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
37a40 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
37a50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37a70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37a80 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  }.      rc = btr
37a90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
37aa0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
37ab0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
37ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
37ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37ae0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
37af0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37b00 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
37b10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
37b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37b30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
37b40 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
37b50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37b60 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
37b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
37b80 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
37b90 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
37ba0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
37bb0 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
37bc0 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
37bd0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
37be0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
37bf0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
37c00 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
37c10 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
37c20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37c30 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
37c40 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
37c50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
37c60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
37c70 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
37c80 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
37c90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37ca0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
37cb0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
37cc0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
37cd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
37ce0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
37cf0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
37d00 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
37d10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37d20 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
37d30 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
37d40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37d50 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
37d60 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
37d70 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
37d80 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
37d90 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
37da0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
37db0 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
37dc0 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
37dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37de0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
37df0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
37e00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
37e10 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
37e20 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
37e30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
37e40 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
37e50 65 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20  eCreateTable(p, 
37e60 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b  piTable, flags);
37e70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37e80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37e90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
37ea0 72 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64  rase the given d
37eb0 61 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64  atabase page and
37ec0 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65   all its childre
37ed0 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  n.  Return.** th
37ee0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
37ef0 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  eelist..*/.stati
37f00 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62  c int clearDatab
37f10 61 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  asePage(.  BtSha
37f20 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
37f30 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
37f40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
37f50 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  he table */.  Pg
37f60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
37f70 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
37f80 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20  er to clear */. 
37f90 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61   int freePageFla
37fa0 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f  g,     /* Deallo
37fb0 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75  cate page if tru
37fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68  e */.  int *pnCh
37fd0 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  ange.){.  MemPag
37fe0 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
37ff0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
38000 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a  ed char *pCell;.
38010 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
38020 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38030 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
38040 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
38050 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
38060 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  pBt) ){.    retu
38070 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
38080 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72  T_BKPT;.  }..  r
38090 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
380a0 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70  ge(pBt, pgno, &p
380b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
380c0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
380d0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
380e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
380f0 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
38100 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
38110 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
38120 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
38130 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
38140 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
38150 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
38160 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43  e(pCell), 1, pnC
38170 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66  hange);.      if
38180 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
38190 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
381a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
381b0 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
381c0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
381d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
381e0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
381f0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ut;.  }.  if( !p
38200 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
38210 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
38220 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
38230 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
38240 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43  Data[8]), 1, pnC
38250 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20  hange);.    if( 
38260 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
38270 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
38280 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43  .  }else if( pnC
38290 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73  hange ){.    ass
382a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
382b0 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61  ey );.    *pnCha
382c0 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43  nge += pPage->nC
382d0 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ell;.  }.  if( f
382e0 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20  reePageFlag ){. 
382f0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
38300 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  (pPage);.  }else
38310 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
38320 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
38330 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30  ge->pDbPage))==0
38340 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   ){.    zeroPage
38350 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61  (pPage, pPage->a
38360 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45  Data[0] | PTF_LE
38370 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64  AF);.  }..cleard
38380 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a  atabasepage_out:
38390 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
383a0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
383b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
383c0 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ete all informat
383d0 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ion from a singl
383e0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  e table in the d
383f0 61 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65  atabase.  iTable
38400 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20   is.** the page 
38410 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f  number of the ro
38420 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
38430 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
38440 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a  tine returns,.**
38450 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
38460 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69  s empty, but sti
38470 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ll exists..**.**
38480 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
38490 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
384a0 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
384b0 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
384c0 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f