/ Hex Artifact Content
Login

Artifact a2117e0dde3eeb5845b3a6f56bfed2255e3eefdb:


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 36 33 20 32 30 30 39 2f 30  c,v 1.663 2009/0
0190: 37 2f 30 38 20 31 38 3a 31 32 3a 34 39 20 64 72  7/08 18:12:49 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 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22f0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2300: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2310: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
2320: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
2330: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79  SQLITE_NOMEM may
2340: 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65   also be returne
2350: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2360: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2370: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
2380: 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20  p, Pgno iTable, 
2390: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
23a0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
23b0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
23c0: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f  Lock = 0;.  BtLo
23d0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
23e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
23f0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
2410: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2420: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2430: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2440: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f  p->db!=0 );..  /
2450: 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  * A connection w
2460: 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63  ith the read-unc
2470: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65  ommitted flag se
2480: 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79  t will never try
2490: 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20   to.  ** obtain 
24a0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e  a read-lock usin
24b0: 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
24c0: 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c   The only read-l
24d0: 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a  ock obtained.  *
24e0: 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f  * by a connectio
24f0: 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d  n in read-uncomm
2500: 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e  itted mode is on
2510: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
2520: 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20  er .  ** table, 
2530: 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73  and that lock is
2540: 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72   obtained in Btr
2550: 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20  eeBeginTrans(). 
2560: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
2570: 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  =(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d  itted) || eLock=
25a0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  =WRITE_LOCK );..
25b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
25c0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
25d0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
25e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
25f0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2600: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2610: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
2620: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
2630: 3d 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68  =querySharedCach
2640: 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
2650: 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a  able, eLock) );.
2660: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
2670: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
2680: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
2690: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
26a0: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
26b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
26c0: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
26d0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
26e0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
26f0: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
2700: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
2710: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
2720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2730: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2740: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
2750: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
2760: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
2770: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
2780: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
2790: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
27a0: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
27b0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
27c0: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
27d0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
27e0: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
27f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2800: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
2810: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
2820: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2830: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2840: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
2850: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
2860: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
2870: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
2880: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
2890: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
28a0: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
28b0: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
28c0: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
28d0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
28e0: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
28f0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
2900: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
2910: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
2920: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
2930: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
2940: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
2950: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
2960: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
2970: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
2980: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
2990: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
29a0: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
29b0: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
29c0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
29d0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
29e0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
29f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a00: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
2a10: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2a20: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2a50: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
2a60: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
2a70: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
2a80: 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68  a calls to.** th
2a90: 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  e setSharedCache
2aa0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63  TableLock() proc
2ab0: 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42  edure) held by B
2ac0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a  tree handle p..*
2ad0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ae0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
2af0: 68 61 6e 64 6c 65 20 70 20 68 61 73 20 61 6e 20  handle p has an 
2b00: 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69  open read or wri
2b10: 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  te .** transacti
2b20: 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e  on. If it does n
2b30: 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42 74 53  ot, then the BtS
2b40: 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20  hared.isPending 
2b50: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 79 20  variable.** may 
2b60: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
2b70: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
2b80: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
2b90: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2ba0: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
2bb0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2bc0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2bd0: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
2be0: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
2bf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2c00: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2c10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2c20: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
2c30: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
2c40: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
2c50: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
2c60: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
2c70: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
2c80: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
2c90: 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69  ( pBt->isExclusi
2ca0: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ve==0 || pBt->pW
2cb0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
2cc0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
2cd0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
2ce0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
2cf0: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
2d00: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
2d10: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
2d20: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
2d30: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
2d40: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
2d50: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
2d60: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
2d70: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
2d80: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
2d90: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
2da0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2dc0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
2dd0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
2df0: 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20 7c 7c  >isPending==0 ||
2e00: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
2e10: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
2e20: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
2e30: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
2e40: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
2e50: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
2e60: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
2e70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
2e80: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
2e90: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
2ea0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2eb0: 6c 6c 65 64 20 77 68 65 6e 20 63 6f 6e 6e 65 63  lled when connec
2ec0: 74 69 6f 6e 20 70 20 69 73 20 63 6f 6e 63 6c 75  tion p is conclu
2ed0: 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a 2a  ding its .    **
2ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2ef0: 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   there currently
2f00: 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65 72   exists a writer
2f10: 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20  , and p is not. 
2f20: 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74 65     ** that write
2f30: 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  r, then the numb
2f40: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  er of locks held
2f50: 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
2f60: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
2f70: 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75 73  n the writer mus
2f80: 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64 72  t be about to dr
2f90: 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  op to zero. In t
2fa0: 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  his case.    ** 
2fb0: 73 65 74 20 74 68 65 20 69 73 50 65 6e 64 69 6e  set the isPendin
2fc0: 67 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20  g flag to 0..   
2fd0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2fe0: 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ere is not curre
2ff0: 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74  ntly a writer, t
3000: 68 65 6e 20 42 74 53 68 61 72 65 64 2e 69 73 50  hen BtShared.isP
3010: 65 6e 64 69 6e 67 20 6d 75 73 74 0a 20 20 20 20  ending must.    
3020: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3030: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3040: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3050: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3060: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3070: 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  isPending = 0;. 
3080: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3090: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
30a0: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
30b0: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
30c0: 74 69 6f 6e 20 70 20 74 6f 20 72 65 61 64 2d 6c  tion p to read-l
30d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
30e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
30f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3100: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3110: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3120: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3130: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3140: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3150: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3160: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3170: 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
3180: 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  ve = 0;.    pBt-
3190: 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  >isPending = 0;.
31a0: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
31b0: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
31c0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
31d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
31e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
31f0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3200: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3210: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3220: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3230: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3240: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3250: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3260: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3270: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3280: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3290: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
32a0: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rence */../*.** 
32b0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
32c0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d  cursor holds a m
32d0: 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
32e0: 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ared.*/.#ifndef 
32f0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
3300: 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  t cursorHoldsMut
3310: 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ex(BtCursor *p){
3320: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
3330: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
3340: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23  pBt->mutex);.}.#
3350: 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20  endif...#ifndef 
3360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3370: 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  BLOB./*.** Inval
3380: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3390: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
33a0: 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43  he for cursor pC
33b0: 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73  ur, if any..*/.s
33c0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
33d0: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
33e0: 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  he(BtCursor *pCu
33f0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
3400: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
3410: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
3420: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
3430: 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
3440: 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >aOverflow = 0;.
3450: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  }../*.** Invalid
3460: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3470: 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
3480: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
3490: 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68   opened.** on th
34a0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
34b0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
34c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
34d0: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
34e0: 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64  owCache(BtShared
34f0: 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
3500: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
3510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3520: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
3530: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
3540: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
3550: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76  >pNext){.    inv
3560: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3570: 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ache(p);.  }.}..
3580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3590: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
35a0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
35b0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
35c0: 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74 72 65 65   table.** b-tree
35d0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
35e0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
35f0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3600: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3610: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3620: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3630: 64 2e 20 41 72 67 75 6d 65 6e 74 20 70 67 6e 6f  d. Argument pgno
3640: 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  Root is the .** 
3650: 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68 65  root-page of the
3660: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 0a   table b-tree. .
3670: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3680: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3690: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
36a0: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
36b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
36c0: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
36d0: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
36e0: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
36f0: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3700: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3710: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3720: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3730: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3740: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3750: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3760: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3770: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3780: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3790: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
37a0: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
37b0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
37c0: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
37d0: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
37e0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
37f0: 20 6f 6e 20 74 68 69 73 20 73 70 65 63 69 66 69   on this specifi
3800: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3810: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3820: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3830: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3840: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3850: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3860: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67  to check */.  Pg
3870: 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20  no pgnoRoot,    
3880: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f        /* Look fo
3890: 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  r read cursors o
38a0: 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a  n this btree */.
38b0: 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20    i64 iRow,     
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
38d0: 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
38e0: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
38f0: 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61  .  int isClearTa
3900: 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ble        /* Tr
3910: 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61  ue if all rows a
3920: 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  re being deleted
3930: 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f   */.){.  BtCurso
3940: 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
3950: 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
3960: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
3970: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3980: 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
3990: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
39a0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
39b0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
39c0: 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
39d0: 6c 65 20 26 26 20 28 69 73 43 6c 65 61 72 54 61  le && (isClearTa
39e0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
39f0: 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20  Key==iRow) ){.  
3a00: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
3a10: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
3a20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
3a30: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  se.  #define inv
3a40: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
3a50: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a60: 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  e invalidateAllO
3a70: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a80: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a90: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
3aa0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
3ab0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62  dif../*.** Set b
3ac0: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
3ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
3af0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
3b00: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
3b10: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
3b20: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
3b30: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
3b40: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
3b50: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
3b60: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3b70: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
3b80: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
3b90: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
3ba0: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
3bb0: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
3bc0: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
3bd0: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
3be0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
3bf0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
3c00: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
3c10: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
3c20: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
3c30: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
3c40: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
3c50: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
3c60: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
3c70: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
3c80: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
3c90: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
3ca0: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
3cb0: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
3cc0: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
3cd0: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
3ce0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
3cf0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
3d00: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
3d10: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
3d20: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
3d30: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
3d40: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
3d50: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
3d60: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
3d70: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
3d80: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
3d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
3da0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
3db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
3dc0: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
3dd0: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
3de0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
3df0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
3e00: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
3e10: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
3e20: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
3e30: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
3e40: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
3e50: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
3e60: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
3e70: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
3e80: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
3e90: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
3ea0: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
3eb0: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
3ec0: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
3ed0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
3ee0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
3ef0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
3f00: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
3f10: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
3f20: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
3f30: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
3f40: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
3f50: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
3f60: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
3f70: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
3f80: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
3f90: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
3fa0: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
3fb0: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
3fc0: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
3fd0: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
3fe0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
3ff0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
4000: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
4010: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
4020: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
4030: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4040: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4050: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4060: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4070: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4080: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4090: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
40a0: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
40b0: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
40c0: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
40d0: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
40e0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
40f0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
4100: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
4110: 6d 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  mmitted if the c
4120: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4130: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4140: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4150: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4160: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4170: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4180: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4190: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
41a0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
41b0: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
41c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
41d0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
41e0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
41f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4200: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   ){.    int nPag
4220: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
4230: 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
4240: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
4250: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4270: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 48 61 73  .      pBt->pHas
4280: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4290: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 28 75  3BitvecCreate((u
42a0: 33 32 29 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  32)nPage);.     
42b0: 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43   if( !pBt->pHasC
42c0: 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
42d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
42e0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
42f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4310: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4320: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4330: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4340: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4350: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4360: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4370: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4380: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4390: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
43a0: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
43b0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
43c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
43d0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
43e0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
43f0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4400: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4410: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4420: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4430: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4440: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4450: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4460: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4470: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4480: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
44a0: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
44b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
44c0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
44d0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
44e0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
44f0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4500: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4510: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4520: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4530: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4540: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4550: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4560: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4570: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4580: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4590: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
45a0: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
45b0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
45c0: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
45d0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
45e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
45f0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4600: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4610: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4620: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4630: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4640: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4650: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4660: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4670: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4680: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4690: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
46a0: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
46b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
46c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
46d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
46e0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
46f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
4700: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
4710: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
4720: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
4730: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
4740: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
4750: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
4760: 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
4770: 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
4780: 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79  Cur, &pCur->nKey
4790: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
47a0: 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61   is an intKey ta
47b0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62  ble, then the ab
47c0: 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  ove call to Btre
47d0: 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20  eKeySize().  ** 
47e0: 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67  stores the integ
47f0: 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e  er key in pCur->
4800: 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61  nKey. In this ca
4810: 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  se this value is
4820: 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69  .  ** all that i
4830: 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65  s required. Othe
4840: 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
4850: 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e  s not open on an
4860: 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62   intKey.  ** tab
4870: 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20  le, then malloc 
4880: 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74  space for and st
4890: 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b  ore the pCur->nK
48a0: 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20  ey bytes of key 
48b0: 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f  .  ** data..  */
48c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
48d0: 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d  E_OK && 0==pCur-
48e0: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
48f0: 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  ey){.    void *p
4900: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
4910: 6c 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e  loc( (int)pCur->
4920: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
4930: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
4940: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4950: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
4960: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
4970: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
4980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4990: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
49a0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
49b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
49c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
49d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
49e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
49f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
4a10: 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65  t( !pCur->apPage
4a20: 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21  [0]->intKey || !
4a30: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
4a40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4a50: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
4a60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4a70: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4a80: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
4a90: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4aa0: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43  ge[i]);.      pC
4ab0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4ac0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  0;.    }.    pCu
4ad0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
4ae0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
4af0: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
4b00: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
4b10: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
4b20: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
4b30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4b40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
4b50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
4b60: 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63 65  ors except pExce
4b70: 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74  pt open on the t
4b80: 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f  able .** with ro
4b90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4ba0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4bb0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4bc0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4bd0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4be0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4bf0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4c00: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
4c10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
4c20: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
4c30: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4c40: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
4c50: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
4c60: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4c70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4c80: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
4c90: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
4ca0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
4cb0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
4cc0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
4cd0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
4ce0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
4cf0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
4d00: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
4d10: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
4d20: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
4d30: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
4d40: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
4d50: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
4d60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
4d70: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
4d80: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
4d90: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
4da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4db0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4dc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
4dd0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
4de0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
4df0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e00: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
4e10: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4e20: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
4e30: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
4e40: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
4e50: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
4e60: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
4e70: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
4e80: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
4e90: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
4ea0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
4eb0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
4ec0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
4ed0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
4ee0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
4ef0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
4f00: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
4f10: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
4f20: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
4f30: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
4f40: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
4f50: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
4f60: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
4f70: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
4f80: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
4f90: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
4fa0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
4fb0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
4fc0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
4fd0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
4fe0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
4ff0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5000: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5010: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5020: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5030: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5040: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5050: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5060: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5070: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5080: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5090: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
50a0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
50b0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
50c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
50d0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
50e0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
50f0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5100: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5110: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5120: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5130: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5140: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5150: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5160: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5170: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5180: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5190: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
51a0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
51b0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
51c0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
51d0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
51e0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5210: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5220: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5230: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5260: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5270: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5280: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5290: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
52a0: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
52b0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
52c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
52d0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
52e0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
52f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5300: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5310: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5320: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5330: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5340: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5350: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5360: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5370: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5380: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5390: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
53a0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
53b0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
53c0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
53d0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
53e0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
53f0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
5400: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5410: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5420: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5430: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5440: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
5450: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5460: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5470: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5480: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5490: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
54a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
54b0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
54c0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
54d0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
54f0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
5500: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
5510: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
5520: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
5530: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
5540: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
5550: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
5560: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
5570: 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ip);.  if( rc==S
5580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5590: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55a0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
55b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
55c0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
55d0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
55e0: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
55f0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
5600: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
5610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
5620: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
5630: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
5640: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
5650: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
5660: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c  ? \.         sql
5670: 69 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65  ite3BtreeRestore
5680: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5690: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
56a0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
56b0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
56c0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
56d0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
56e0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  m the position i
56f0: 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c  t.** was last pl
5700: 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72  aced at.  Cursor
5710: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
5720: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
5730: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20   pointing.** at 
5740: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  is deleted out f
5750: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a  rom under them..
5760: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5770: 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ne returns an er
5780: 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65  ror code if some
5790: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
57a0: 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65  .  The.** intege
57b0: 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20  r *pHasMoved is 
57c0: 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68  set to one if th
57d0: 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  e cursor has mov
57e0: 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e  ed and 0 if not.
57f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
5800: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
5810: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
5820: 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65  r, int *pHasMove
5830: 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  d){.  int rc;.. 
5840: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
5850: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
5860: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
5870: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5880: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
5890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
58b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
58c0: 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a  skip!=0 ){.    *
58d0: 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20  pHasMoved = 1;. 
58e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61   }else{.    *pHa
58f0: 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  sMoved = 0;.  }.
5900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5910: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
5920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
5930: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
5940: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
5950: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
5960: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
5970: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
5980: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
5990: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
59a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
59b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
59c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
59d0: 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ber..*/.static P
59e0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
59f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5a00: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
5a10: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
5a20: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
5a30: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
5a40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5a50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5a60: 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  ) );.  nPagesPer
5a70: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
5a80: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
5a90: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
5aa0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
5ab0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
5ac0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
5ad0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
5ae0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
5af0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
5b00: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
5b10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
5b20: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
5b30: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
5b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
5b70: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5b80: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
5b90: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
5ba0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
5bb0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
5bc0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
5bd0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20  r 'pgno'..** An 
5be0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5bf0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
5c00: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
5c10: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
5c20: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
5c30: 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  nt ptrmapPut(BtS
5c40: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5c50: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
5c60: 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20  Pgno parent){.  
5c70: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
5c80: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
5c90: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
5ca0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
5cb0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5cc0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
5cd0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
5ce0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5cf0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
5d00: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
5d10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
5d20: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
5d30: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
5d40: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
5d50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5d60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5d70: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
5d80: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
5d90: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
5da0: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
5db0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
5dc0: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
5dd0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
5de0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
5df0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
5e00: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
5e10: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
5e20: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
5e30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5e40: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74  _BKPT;.  }.  iPt
5e50: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
5e60: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
5e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
5e80: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
5e90: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
5ea0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
5eb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5ed0: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
5ee0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
5ef0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
5f00: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
5f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
5f20: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
5f30: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
5f40: 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  t;.  }.  pPtrmap
5f50: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
5f60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
5f70: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
5f80: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
5f90: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
5fa0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
5fb0: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
5fc0: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
5fd0: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
5fe0: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
5ff0: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
6000: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6010: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6020: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6030: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6040: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6050: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6060: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6070: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6080: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6090: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
60a0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
60b0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
60c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
60d0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
60e0: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
60f0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6100: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6110: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
6120: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
6130: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
6140: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
6150: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
6160: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
6170: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
6180: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
6190: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
61a0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
61b0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
61c0: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
61d0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
61e0: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
61f0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6200: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
6210: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
6220: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
6230: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
6240: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6250: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
6260: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
6270: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
6280: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6290: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
62a0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
62b0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
62c0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
62d0: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
62e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
62f0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
6300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6310: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
6320: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
6330: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6340: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6350: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6360: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6370: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6380: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  e);.  if( rc!=0 
6390: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
63a0: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20  ;.  }.  pPtrmap 
63b0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
63c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
63d0: 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20  age);..  offset 
63e0: 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53  = PTRMAP_PTROFFS
63f0: 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29  ET(iPtrmap, key)
6400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6410: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6420: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6430: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6440: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6450: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6460: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6470: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6480: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6490: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
64a0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
64b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
64c0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
64d0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
64e0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
64f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6500: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6510: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6520: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6530: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6540: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6550: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6560: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6570: 74 72 28 78 2c 20 79 29 20 53 51 4c 49 54 45 5f  tr(x, y) SQLITE_
6580: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
6590: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
65a0: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
65b0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
65c0: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
65d0: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
65e0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
65f0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
6600: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
6610: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
6620: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
6630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6640: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
6650: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
6660: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
6670: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
6680: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
6690: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
66a0: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
66b0: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
66c0: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
66d0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
66e0: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
66f0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6700: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6710: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6720: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6730: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6740: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6750: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6760: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6770: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6780: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6790: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
67a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
67b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
67c0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
67d0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
67e0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
67f0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
6800: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
6810: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
6820: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
6830: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
6840: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
6850: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
6860: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
6870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
6880: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
6890: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
68a0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
68b0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
68c0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
68d0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
68e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
68f0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
6900: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
6910: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
6920: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
6930: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
6940: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
6950: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
6960: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
6970: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
6980: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
6990: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
69a0: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
69b0: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
69c0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
69d0: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
69e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
69f0: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
6a00: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
6a10: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
6a20: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
6a30: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
6a40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6a50: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
6a60: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
6a70: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
6a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6a90: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6aa0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
6ab0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
6ac0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
6ad0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
6ae0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
6af0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
6b00: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
6b10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
6b20: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
6b30: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
6b40: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
6b50: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
6b60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6b70: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
6b80: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
6b90: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
6ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
6bb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
6bc0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
6bd0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
6be0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6bf0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
6c00: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
6c10: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
6c20: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
6c30: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
6c40: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
6c50: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
6c60: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
6c70: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
6c80: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
6c90: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
6ca0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
6cb0: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
6cc0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
6cd0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
6ce0: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
6cf0: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
6d00: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
6d10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
6d20: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
6d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
6d40: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
6d50: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
6d60: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
6d70: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
6d80: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
6d90: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
6da0: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
6db0: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
6dc0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
6dd0: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
6de0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
6df0: 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63  der = n;.  testc
6e00: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
6e10: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
6e20: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
6e30: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
6e40: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
6e50: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
6e60: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
6e70: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
6e80: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
6e90: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
6ea0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
6eb0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
6ec0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
6ed0: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
6ee0: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
6ef0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
6f00: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
6f10: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
6f20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
6f30: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69  bytes */.    nSi
6f40: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
6f50: 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  n;.    pInfo->nL
6f60: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
6f70: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
6f80: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
6f90: 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26      if( (nSize &
6fa0: 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   ~3)==0 ){.     
6fb0: 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20   nSize = 4;     
6fc0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
6fd0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
6fe0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
6ff0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53  >nSize = (u16)nS
7000: 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ize;.  }else{.  
7010: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
7020: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
7030: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7040: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7050: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7060: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7070: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7080: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7090: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
70a0: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
70b0: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
70c0: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
70d0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
70e0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
70f0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
7100: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
7110: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
7120: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
7130: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7140: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7150: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7160: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7170: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7180: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7190: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
71a0: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
71b0: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
71c0: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
71d0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
71e0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
71f0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
7200: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7210: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7220: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
7230: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7240: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7250: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7260: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7270: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7280: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7290: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
72a0: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
72b0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
72c0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
72d0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
72e0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
72f0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
7300: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
7310: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
7320: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7330: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7340: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
7350: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
7360: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7370: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
7380: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7390: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
73a0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
73b0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
73c0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
73d0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
73e0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
73f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
7400: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7410: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7420: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
7430: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
7440: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7450: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
7460: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
7470: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7480: 29 20 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ) \.  sqlite3Btr
7490: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28  eeParseCellPtr((
74a0: 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c  pPage), findCell
74b0: 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c  ((pPage), (iCell
74c0: 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69  )), (pInfo)).voi
74d0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
74e0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
74f0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
7500: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7510: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7520: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
7530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7540: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
7550: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
7560: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7570: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7580: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7590: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
75a0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
75b0: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d  iCell, pInfo);.}
75c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
75d0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
75e0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61   of bytes that a
75f0: 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74   Cell needs in t
7600: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7610: 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65  area of the btre
7620: 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74  e-page.  The ret
7630: 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75  urn number inclu
7640: 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20  des the cell.** 
7650: 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20  data header and 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61  the local payloa
7670: 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f  d, but not any o
7680: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a  verflow page or.
7690: 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65  ** the space use
76a0: 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f  d by the cell po
76b0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
76c0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
76d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
76e0: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
76f0: 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c  8 *pIter = &pCel
7700: 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  l[pPage->childPt
7710: 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53  rSize];.  u32 nS
7720: 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ize;..#ifdef SQL
7730: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
7740: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7750: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
7760: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
7770: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
7780: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
7790: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
77a0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
77b0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
77c0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
77d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
77e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
77f0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
7800: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
7810: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
7820: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
7830: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
7840: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
7850: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
7860: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
7870: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
7880: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
7890: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
78a0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
78b0: 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  ey ){.    u8 *pE
78c0: 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  nd;.    if( pPag
78d0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
78e0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
78f0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7900: 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  nSize);.    }els
7910: 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  e{.      nSize =
7920: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7930: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
7940: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
7950: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
7960: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
7970: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
7980: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
7990: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
79a0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
79b0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
79c0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
79d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
79e0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
79f0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
7a00: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
7a10: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
7a20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
7a30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20  else{.    pIter 
7a40: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7a50: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
7a60: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  }..  testcase( n
7a70: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7a80: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
7a90: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
7aa0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7ab0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
7ac0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
7ad0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7ae0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7af0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7b00: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7b10: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7b20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7b30: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7b40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7b50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7b60: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
7b70: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7b80: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
7b90: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
7ba0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
7bb0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
7bc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7bd0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20     nSize += 4;. 
7be0: 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75   }.  nSize += (u
7bf0: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
7c00: 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69  l);..  /* The mi
7c10: 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e  nimum size of an
7c20: 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65  y cell is 4 byte
7c30: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a  s. */.  if( nSiz
7c40: 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  e<4 ){.    nSize
7c50: 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 4;.  }..  ass
7c60: 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75  ert( nSize==debu
7c70: 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20  ginfo.nSize );. 
7c80: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
7c90: 7a 65 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ze;.}.#ifndef ND
7ca0: 45 42 55 47 0a 73 74 61 74 69 63 20 75 31 36 20  EBUG.static u16 
7cb0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
7cc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7cd0: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
7ce0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
7cf0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
7d00: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
7d10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
7d20: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7d30: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
7d40: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
7d50: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
7d60: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
7d70: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
7d80: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
7d90: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7da0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
7db0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
7dc0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
7dd0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74  ic int ptrmapPut
7de0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
7df0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
7e00: 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  l){.  CellInfo i
7e10: 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70  nfo;.  assert( p
7e20: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c  Cell!=0 );.  sql
7e30: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
7e40: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7e50: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
7e60: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
7e70: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
7e80: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
7e90: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
7ea0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
7eb0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
7ec0: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
7ed0: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
7ee0: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72  verflow]);.    r
7ef0: 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28  eturn ptrmapPut(
7f00: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
7f10: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
7f20: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  W1, pPage->pgno)
7f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7f40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
7f50: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
7f60: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
7f70: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
7f80: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
7f90: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
7fa0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
7fb0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
7fc0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
7fd0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
7fe0: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
7ff0: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
8000: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
8010: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
8020: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8030: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
8040: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
8050: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
8060: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8080: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
8090: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
80b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
80c0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
80d0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
80e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
80f0: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8100: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8110: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8120: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8130: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
8140: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
8150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8160: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
8170: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
8180: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
8190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
81a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
81b0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
81c0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
81f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8200: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8210: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8230: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
8240: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8250: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
8260: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
8270: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
8280: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
8290: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
82a0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
82b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
82c0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
82d0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
82e0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
82f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
8300: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
8310: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
8320: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
8330: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8340: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8350: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8360: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8370: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
8380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8390: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
83a0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
83b0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
83c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
83d0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
83e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
83f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8400: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8410: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
8420: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
8430: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
8440: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
8450: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
8460: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8470: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
8480: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8490: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
84a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
84b0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
84c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
84d0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
84e0: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
84f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
8500: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
8510: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
8520: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
8530: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
8540: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
8550: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
8560: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
8570: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
8580: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
8590: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
85a0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
85b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
85c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
85d0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
85e0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
85f0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
8600: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
8610: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
8620: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8630: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
8640: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8650: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8660: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8670: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
8680: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8690: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
86a0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
86b0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
86c0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
86d0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 73 71  n verified in sq
86e0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
86f0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
8700: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8710: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8720: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
8730: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
8740: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
8750: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
8760: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8770: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8780: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
8790: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
87a0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
87b0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
87c0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
87d0: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
87e0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
87f0: 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e   size;.#if defin
8800: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
8810: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
8820: 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62  HECK).    if( cb
8830: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  rk<iCellFirst ){
8840: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8850: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8860: 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  T;.    }.#else. 
8870: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8880: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
8890: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
88a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
88b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
88c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
88d0: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
88e0: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
88f0: 20 26 26 20 63 62 72 6b 3e 69 43 65 6c 6c 46 69   && cbrk>iCellFi
8900: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
8910: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
8920: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8930: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
8940: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
8950: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
8960: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
8970: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
8980: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
8990: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
89a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
89b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
89c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
89d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
89e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
89f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
8a00: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
8a10: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
8a20: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
8a30: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
8a40: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
8a50: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
8a60: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8a70: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
8a80: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
8a90: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
8aa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8ab0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8ad0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8ae0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
8af0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
8b00: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
8b10: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
8b20: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
8b30: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
8b40: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
8b50: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
8b60: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
8b70: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8b80: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
8b90: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
8ba0: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
8bb0: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
8bc0: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
8bd0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
8be0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
8bf0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
8c00: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
8c10: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
8c20: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
8c30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
8c40: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
8c50: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
8c60: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
8c70: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
8c80: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
8c90: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
8ca0: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
8cb0: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
8cc0: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
8cd0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
8ce0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
8cf0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
8d00: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
8d10: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
8d20: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
8d30: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
8d40: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
8d50: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
8d60: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
8d70: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
8d80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8d90: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
8da0: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
8db0: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
8dc0: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
8dd0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
8de0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8df0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
8e00: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
8e10: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
8e20: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
8e30: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
8e40: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8e70: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
8e80: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
8e90: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
8ec0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
8ed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8ee0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
8ef0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
8f00: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
8f10: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
8f20: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
8f30: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
8f40: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
8f50: 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20 61 73   code */.  .  as
8f60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8f70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8f80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8f90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8fa0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
8fb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8fc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8fe0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
8ff0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9000: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9010: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9020: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9040: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9050: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
9060: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65  a[hdr+7];.  asse
9070: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
9080: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
9090: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
90a0: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
90b0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
90c0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
90d0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
90e0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
90f0: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
9100: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9110: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
9120: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9130: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
9140: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
9150: 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  );..  if( nFrag>
9160: 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  =60 ){.    /* Al
9170: 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20  ways defragment 
9180: 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65  highly fragmente
9190: 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  d pages */.    r
91a0: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
91b0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
91c0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
91d0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
91e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
91f0: 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  5]);.  }else if(
9200: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
9210: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
9220: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
9230: 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f  g for a free slo
9240: 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  t big enough to 
9250: 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20  satisfy .    ** 
9260: 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65  the request. The
9270: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d   allocation is m
9280: 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ade from the fir
9290: 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20  st free slot in 
92a0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74  .    ** the list
92b0: 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65   that is large e
92c0: 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64  nough to accomad
92d0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
92e0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
92f0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
9300: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
9310: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9320: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9330: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20       int size = 
9340: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9350: 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69  c+2]);     /* Si
9360: 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20  ze of free slot 
9370: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  */.      if( siz
9380: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9390: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
93a0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
93b0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
93c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
93d0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
93e0: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
93f0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9400: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9410: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9420: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9430: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9440: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9450: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9460: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9470: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9480: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9490: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
94a0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
94b0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
94c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
94d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
94e0: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
94f0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9500: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9510: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9520: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9530: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9540: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9550: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9560: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9570: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9580: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9590: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
95a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
95b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
95c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
95d0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
95e0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
95f0: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9600: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9610: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9620: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9630: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9640: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9650: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9660: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9670: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9680: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9690: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
96a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
96b0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
96c0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
96d0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
96e0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
96f0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9700: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9710: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9720: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9730: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9750: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
9760: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
9770: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
9780: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 2a 70 49 64  5], top);.  *pId
9790: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
97a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
97b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
97c0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
97d0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
97e0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
97f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9800: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9810: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9820: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9830: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9840: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9850: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9860: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9870: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9880: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9890: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
98a0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
98b0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
98c0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
98d0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
98e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
98f0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9900: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9910: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9920: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9950: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9960: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9970: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9980: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
99a0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
99b0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
99c0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
99d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
99e0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
99f0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
9a00: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
9a10: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
9a20: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
9a30: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
9a40: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
9a50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9a60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9a70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9a80: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
9a90: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
9aa0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9ab0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9ac0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
9ad0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
9ae0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
9af0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
9b00: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
9b10: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
9b20: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
9b30: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
9b40: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9b50: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
9b60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
9b70: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
9b80: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
9b90: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
9ba0: 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ocks.  Note that
9bb0: 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
9bc0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
9bd0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
9be0: 20 62 79 20 73 71 6c 69 74 65 33 42 74 72 65 65   by sqlite3Btree
9bf0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
9c00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
9c10: 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20  tPage() did not 
9c20: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69  detect overlappi
9c30: 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a  ng cells or.  **
9c40: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
9c50: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
9c60: 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74  s.   Nor does it
9c70: 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65   detect when the
9c80: 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65  .  ** cell conte
9c90: 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20  nt area exceeds 
9ca0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
9cb0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49   page header.  I
9cc0: 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74  f these.  ** sit
9cd0: 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74  uations arise, t
9ce0: 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69  hen subsequent i
9cf0: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
9d00: 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20   might corrupt. 
9d10: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
9d20: 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64  .  So we do need
9d30: 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f   to check for co
9d40: 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73  rruption while s
9d50: 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65  canning.  ** the
9d60: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
9d70: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
9d80: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
9d90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
9da0: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
9db0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9dc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
9dd0: 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68  t<=iLast );.  wh
9de0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
9df0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9e00: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
9e10: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69  begin>0 ){.    i
9e20: 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34  f( pbegin<addr+4
9e30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9e40: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9e50: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
9e60: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
9e70: 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e   }.  if( pbegin>
9e80: 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74  iLast ){.    ret
9e90: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9ea0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
9eb0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
9ec0: 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20  dr || pbegin==0 
9ed0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
9ee0: 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74  ata[addr], start
9ef0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
9f00: 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67  ata[start], pbeg
9f10: 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  in);.  put2byte(
9f20: 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20  &data[start+2], 
9f30: 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  size);.  pPage->
9f40: 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e  nFree = pPage->n
9f50: 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65  Free + (u16)size
9f60: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
9f70: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
9f80: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
9f90: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
9fa0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
9fb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9fc0: 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e  r]))>0 ){.    in
9fd0: 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20  t pnext, psize, 
9fe0: 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
9ff0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
a000: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a010: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
a020: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
a030: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
a040: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
a050: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
a060: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
a070: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
a080: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
a090: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
a0a0: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
a0b0: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
a0c0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
a0d0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
a0e0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
a0f0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
a100: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
a110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a120: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a130: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
a140: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
a150: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
a160: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
a170: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
a180: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
a190: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
a1a0: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
a1b0: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
a1c0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
a1d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
a1e0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
a1f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a200: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a210: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
a220: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a230: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
a240: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
a250: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
a260: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
a270: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
a280: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
a290: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
a2a0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
a2b0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a2c0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
a2d0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
a2e0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
a2f0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
a300: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
a310: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
a320: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a330: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
a340: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a350: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
a360: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a370: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a380: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a390: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
a3a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
a3b0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
a3c0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
a3d0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
a3e0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
a3f0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
a400: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
a410: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
a420: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
a430: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
a440: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
a450: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
a460: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
a470: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
a480: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
a490: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
a4a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
a4b0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
a4c0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
a4d0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
a4e0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
a4f0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
a500: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
a510: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
a520: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
a530: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
a540: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
a550: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
a560: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
a570: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
a580: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
a590: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
a5a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
a5b0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
a5c0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
a5d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a5e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a5f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a600: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
a610: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
a620: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
a630: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
a640: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
a650: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
a660: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
a670: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
a680: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
a690: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
a6a0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
a6b0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
a6c0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
a6d0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
a6e0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
a6f0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
a700: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
a710: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
a720: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
a730: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
a740: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
a750: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
a760: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
a770: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
a780: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
a790: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
a7a0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
a7b0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
a7c0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
a7d0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
a7e0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
a7f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
a800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a810: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
a820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a830: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a840: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
a850: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
a860: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
a870: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
a880: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
a890: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
a8a0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
a8b0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
a8c0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
a8d0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
a8e0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
a8f0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
a900: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
a910: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
a920: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
a930: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
a940: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
a950: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
a960: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
a970: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
a980: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
a990: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
a9a0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
a9b0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
a9c0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
a9d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a9e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a9f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
aa00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
aa10: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
aa20: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
aa30: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
aa40: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
aa50: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
aa60: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
aa70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
aa80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
aa90: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
aaa0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
aab0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
aac0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
aad0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
aae0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
aaf0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
ab00: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
ab10: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
ab20: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
ab30: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
ab40: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
ab50: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
ab60: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
ab70: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
ab80: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
ab90: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
aba0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
abb0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
abc0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
abd0: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
abe0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
abf0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
ac00: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
ac10: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
ac20: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
ac30: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
ac40: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
ac50: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
ac60: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
ac70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac80: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
ac90: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
aca0: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
acb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
acc0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
acd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
ace0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
acf0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
ad00: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
ad10: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ad20: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
ad30: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
ad40: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
ad50: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ad60: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
ad70: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ad80: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
ad90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ada0: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
adb0: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
adc0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
add0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
adf0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
ae00: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
ae10: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
ae20: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32  Bt->pageSize<=32
ae30: 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67 65  768 );.    pPage
ae40: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
ae50: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
ae60: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
ae70: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
ae80: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
ae90: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
aea0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
aeb0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
aec0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
aed0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74  age->leaf;.    t
aee0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
aef0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
af00: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
af10: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
af20: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
af30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
af40: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
af50: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
af60: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
af70: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
af80: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
af90: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
afa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
afb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
afc0: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
afd0: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
afe0: 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  pBt) );..    /* 
aff0: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
b000: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
b010: 63 61 75 73 65 20 75 73 65 20 74 6f 20 72 65 61  cause use to rea
b020: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
b030: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
b040: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
b050: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
b060: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
b070: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
b080: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
b090: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
b0a0: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
b0b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
b0c0: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
b0d0: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
b0e0: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
b0f0: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
b100: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
b110: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
b120: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
b130: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
b140: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b150: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
b160: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b170: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
b180: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
b190: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
b1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b1b0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
b1c0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
b1d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
b1e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b1f0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
b200: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
b210: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
b220: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
b230: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
b240: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
b250: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
b260: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
b270: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
b280: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b290: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b2a0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b2b0: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
b2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
b2d0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
b2e0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
b2f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
b300: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b310: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
b320: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
b330: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
b340: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
b350: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
b360: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
b370: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
b380: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
b390: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b3a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b3b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
b3c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b3d0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
b3e0: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
b3f0: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
b400: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b410: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
b420: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
b430: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
b440: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
b450: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
b460: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
b470: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
b480: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
b490: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
b4a0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
b4b0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
b4c0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
b4d0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
b4e0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
b4f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
b500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b510: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
b520: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
b530: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
b540: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
b550: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
b560: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
b570: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
b580: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
b590: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
b5a0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
b5b0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
b5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b5d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b5e0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
b5f0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
b600: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
b610: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
b620: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
b630: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
b640: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
b650: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
b660: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
b670: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
b680: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
b690: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
b6a0: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
b6b0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
b6c0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
b6d0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
b6e0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
b6f0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
b700: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
b710: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
b720: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
b730: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
b740: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
b750: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
b760: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
b770: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
b780: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
b790: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
b7a0: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
b7b0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
b7c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b7d0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
b7e0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
b7f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b800: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
b810: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
b820: 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72  nFree - iCellFir
b830: 73 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  st;.    pPage->i
b840: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
b850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b860: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
b870: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
b880: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
b890: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
b8a0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
b8b0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
b8c0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
b8d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
b8e0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
b8f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b900: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b910: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
b920: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
b930: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
b940: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
b950: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
b960: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b970: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
b980: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
b990: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
b9a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b9b0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
b9d0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
b9e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b9f0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ba00: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
ba10: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
ba20: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ba30: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ba40: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ba50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ba60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ba70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d  >mutex) );.  /*m
ba80: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
ba90: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
baa0: 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20  Size - hdr);*/. 
bab0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
bac0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
bad0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a  t = hdr + 8 + 4*
bae0: 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46  ((flags&PTF_LEAF
baf0: 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65  )==0 ?1:0);.  me
bb00: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
bb10: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
bb20: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
bb30: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
bb40: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
bb50: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
bb60: 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
bb70: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
bb80: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
bb90: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
bba0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
bbb0: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
bbc0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
bbd0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
bbe0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
bbf0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
bc00: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
bc10: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37  t->pageSize<=327
bc20: 36 38 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  68 );.  pPage->m
bc30: 61 73 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70  askPage = pBt->p
bc40: 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70  ageSize - 1;.  p
bc50: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
bc60: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
bc70: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
bc80: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
bc90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
bca0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
bcb0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
bcc0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
bcd0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
bce0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
bcf0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
bd00: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
bd10: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
bd20: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
bd30: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
bd40: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
bd50: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
bd60: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
bd70: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
bd80: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
bd90: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
bda0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
bdb0: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
bdc0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
bdd0: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
bde0: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
bdf0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
be00: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
be10: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
be20: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
be30: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
be40: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
be50: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
be60: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
be70: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
be80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
be90: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
bea0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
beb0: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
bec0: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
bed0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
bee0: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
bef0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
bf00: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
bf10: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
bf20: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
bf30: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
bf40: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
bf50: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
bf60: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
bf70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
bf80: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
bf90: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
bfa0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
bfb0: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
bfc0: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
bfd0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
bfe0: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
bff0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
c000: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c010: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
c020: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
c030: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
c040: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
c050: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c060: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
c070: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
c080: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
c090: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
c0a0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
c0b0: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  eter */.  int no
c0c0: 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f  Content        /
c0d0: 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61  * Do not load pa
c0e0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72  ge content if tr
c0f0: 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
c100: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
c110: 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
c120: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c130: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c140: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
c150: 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
c160: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
c170: 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
c180: 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
c190: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
c1a0: 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
c1b0: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
c1c0: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
c1d0: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
c1e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c1f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
c200: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
c210: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
c220: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
c230: 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
c240: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
c250: 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
c260: 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
c270: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
c280: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
c290: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
c2a0: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
c2b0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
c2c0: 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
c2d0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
c2e0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
c2f0: 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
c300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c310: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c320: 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
c330: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
c340: 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
c350: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
c360: 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
c370: 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
c380: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c390: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c3a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
c3b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c3c0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c3d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
c3e0: 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
c3f0: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
c400: 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
c410: 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
c420: 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
c430: 67 6e 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75  gno pagerPagecou
c440: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
c450: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  ){.  int nPage =
c460: 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20   -1;.  int rc;. 
c470: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
c480: 61 67 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73  age1 );.  rc = s
c490: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
c4a0: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
c4b0: 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73  , &nPage);.  ass
c4c0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
c4d0: 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20  OK || nPage==-1 
c4e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e  );.  return (Pgn
c4f0: 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  o)nPage;.}../*.*
c500: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c510: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
c520: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
c530: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
c540: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
c550: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
c560: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
c570: 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
c580: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
c590: 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  and sqlite3Btree
c5a0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  InitPage()..*/.s
c5b0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64  tatic int getAnd
c5c0: 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68  InitPage(.  BtSh
c5d0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
c5e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
c5f0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
c600: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
c610: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c620: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
c630: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
c640: 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69  pPage     /* Wri
c650: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
c660: 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ter here */.){. 
c670: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
c680: 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
c690: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c6a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c6b0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
c6c0: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
c6d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c6e0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20  PT_BKPT; .  }.. 
c6f0: 20 2f 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20   /* It is often 
c700: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
c710: 65 20 70 61 67 65 20 77 65 20 77 61 6e 74 20 69  e page we want i
c720: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
c730: 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20  he..  ** If so, 
c740: 67 65 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e  get it directly.
c750: 20 20 54 68 69 73 20 73 61 76 65 73 20 75 73 20    This saves us 
c760: 66 72 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63  from having to c
c770: 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61  all.  ** pagerPa
c780: 67 65 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b  gecount() to mak
c790: 65 20 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77  e sure pgno is w
c7a0: 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68  ithin limits, wh
c7b0: 69 63 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  ich results.  **
c7c0: 20 69 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c   in a measureabl
c7d0: 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  e performance im
c7e0: 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  provements..  */
c7f0: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61  .  *ppPage = pPa
c800: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
c810: 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b  okup(pBt, pgno);
c820: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
c830: 20 20 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61      /* Page is a
c840: 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 20  lready in cache 
c850: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
c860: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
c870: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20      /* Page not 
c880: 69 6e 20 63 61 63 68 65 2e 20 20 41 63 71 75 69  in cache.  Acqui
c890: 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 74 65  re it. */.    te
c8a0: 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 70 61  stcase( pgno==pa
c8b0: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
c8c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ) );.    if( pgn
c8d0: 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o>pagerPagecount
c8e0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
c8f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c900: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c910: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
c920: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
c930: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
c940: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
c950: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c960: 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67    pPage = *ppPag
c970: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  e;.  }.  if( !pP
c980: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
c990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
c9a0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
c9b0: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
c9c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c9d0: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
c9e0: 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50  pPage);.    *ppP
c9f0: 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
ca00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ca10: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
ca20: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
ca30: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
ca40: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
ca50: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
ca60: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
ca70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
ca90: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
caa0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
cab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cac0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73  Overflow==0 || s
cad0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
cae0: 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  efcount(pPage->p
caf0: 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20  DbPage)>1 );.   
cb00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cb10: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
cb20: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
cb30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
cb40: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
cb50: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
cb60: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
cb70: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
cb80: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
cb90: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
cba0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
cbb0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
cbc0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cbd0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
cbe0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
cbf0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
cc00: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
cc10: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
cc20: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
cc30: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
cc40: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
cc50: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
cc60: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
cc70: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
cc80: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
cc90: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
cca0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
ccb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
ccc0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
ccd0: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
cce0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
ccf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
cd00: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
cd10: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
cd20: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
cd30: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
cd40: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
cd50: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
cd60: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
cd70: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
cd80: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
cd90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
cda0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
cdb0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
cdc0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
cdd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cde0: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
cdf0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
ce00: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
ce10: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
ce20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ce30: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
ce40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
ce50: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
ce60: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
ce70: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
ce80: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
ce90: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
cea0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
ceb0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
cec0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
ced0: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
cee0: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
cef0: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
cf00: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
cf10: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
cf20: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
cf30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
cf40: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
cf50: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
cf60: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
cf70: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
cf80: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
cf90: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
cfa0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
cfb0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
cfc0: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
cfd0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
cfe0: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
cff0: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
d000: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
d010: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
d020: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
d030: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
d040: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
d050: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
d060: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d070: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
d080: 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
d090: 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
d0a0: 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
d0b0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
d0c0: 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
d0d0: 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
d0e0: 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
d0f0: 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
d100: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d110: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d120: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
d130: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
d140: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d150: 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
d160: 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  Handler);.}../*.
d170: 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61  ** Open a databa
d180: 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
d190: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
d1a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
d1b0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
d1c0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
d1d0: 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62  L.** a new datab
d1e0: 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f  ase with a rando
d1f0: 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65  m name is create
d200: 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c  d.  This randoml
d210: 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62  y named.** datab
d220: 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  ase file will be
d230: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71   deleted when sq
d240: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d250: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
d260: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
d270: 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
d280: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
d290: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
d2a0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f  .** that is auto
d2b0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f  matically destro
d2c0: 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63  yed when it is c
d2d0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
d2e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
d2f0: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
d300: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d310: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
d320: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
d330: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
d340: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
d350: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
d360: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
d370: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
d380: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
d390: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
d3a0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
d3b0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
d3c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
d3d0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
d3e0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
d3f0: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
d400: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
d410: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
d420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
d430: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
d440: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
d450: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
d460: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
d470: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
d480: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
d490: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
d4a0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
d4b0: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
d4c0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d4d0: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
d4e0: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
d4f0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d510: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
d520: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
d530: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
d540: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
d550: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
d560: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
d570: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
d580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d590: 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20   VFS to use for 
d5a0: 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20  this btree */.  
d5b0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
d5c0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
d5d0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
d5e0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
d5f0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
d620: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
d630: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
d640: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
d650: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
d660: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
d670: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
d680: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d6a0: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
d6b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
d6c0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
d6f0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
d700: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
d710: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
d720: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
d730: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
d740: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53  ntent */..  /* S
d750: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
d760: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
d770: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
d780: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
d790: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
d7a0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
d7b0: 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c  ase. This symbol
d7c0: 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65   is only require
d7d0: 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72  d if.  ** either
d7e0: 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64   of the shared-d
d7f0: 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75  ata or autovacuu
d800: 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63  m features are c
d810: 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e  ompiled .  ** in
d820: 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a  to the library..
d830: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
d840: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
d850: 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21  ARED_CACHE) || !
d860: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
d870: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a  MIT_AUTOVACUUM).
d880: 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f    #ifdef SQLITE_
d890: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
d8a0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
d8b0: 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65  mdb = 0;.  #else
d8c0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
d8d0: 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61  sMemdb = zFilena
d8e0: 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46  me && !strcmp(zF
d8f0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
d900: 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23  y:");.  #endif.#
d910: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
d920: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
d930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d940: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
d950: 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64  ) );..  pVfs = d
d960: 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73  b->pVfs;.  p = s
d970: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
d980: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
d990: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
d9a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d9b0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
d9c0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
d9d0: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
d9e0: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
d9f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
da00: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
da10: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
da20: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
da30: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
da40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
da50: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
da60: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
da70: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
da80: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
da90: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
daa0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
dab0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
dac0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
dad0: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
dae0: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
daf0: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
db00: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
db10: 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26  0 && zFilename &
db20: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
db30: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
db40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
db50: 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
db60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46   ){.      int nF
db70: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
db80: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
db90: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
dba0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
dbb0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c  lite3Malloc(nFul
dbc0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
dbd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
dbe0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
dbf0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
dc00: 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66  = 1;.      db->f
dc10: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
dc20: 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20  haredCache;.    
dc30: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
dc40: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
dc50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
dc60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
dc70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dc80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
dc90: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
dca0: 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
dcb0: 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, nFullPathname
dcc0: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
dcd0: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  ;.      mutexOpe
dce0: 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
dcf0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
dd00: 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
dd10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
dd20: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
dd30: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
dd40: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
dd50: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
dd60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
dd70: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
dd80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
dd90: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
dda0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  ;.      for(pBt=
ddb0: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
ddc0: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
ddd0: 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
dde0: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
ddf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
de00: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
de10: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
de20: 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
de30: 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
de40: 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
de50: 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
de60: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
de70: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
de80: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
de90: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
dea0: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
deb0: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
dec0: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
ded0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
dee0: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
def0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
df00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
df10: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
df20: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
df30: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
df40: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
df50: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
df60: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
df70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
df80: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
df90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
dfa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dfb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
dfd0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
dff0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
e000: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
e010: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
e020: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
e030: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
e040: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
e050: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
e060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e070: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
e080: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
e090: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
e0a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
e0b0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e0c0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
e0d0: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
e0e0: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
e0f0: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
e100: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
e110: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
e120: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
e130: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
e140: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
e150: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
e160: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
e170: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
e180: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
e190: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
e1a0: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
e1b0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
e1c0: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
e1d0: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
e1e0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
e1f0: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
e200: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
e210: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
e220: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
e230: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
e240: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
e250: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
e260: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
e270: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
e280: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
e290: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
e2a0: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
e2b0: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
e2c0: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
e2d0: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
e2e0: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
e2f0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
e300: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
e310: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
e320: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
e330: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
e340: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
e350: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
e360: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
e370: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
e380: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
e390: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
e3a0: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
e3b0: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
e3c0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
e3d0: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
e3e0: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
e3f0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
e400: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
e410: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
e420: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
e430: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
e440: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
e450: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
e460: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
e490: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
e4a0: 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  s);.    if( rc==
e4b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e4c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e4d0: 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
e4e0: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
e4f0: 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
e500: 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
e510: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
e520: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e530: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
e540: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
e550: 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
e560: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
e570: 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42  etBusyhandler(pB
e580: 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
e590: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
e5a0: 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
e5b0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
e5c0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e5d0: 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70  tReiniter(pBt->p
e5e0: 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69  Pager, pageReini
e5f0: 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  t);.    pBt->pCu
e600: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
e610: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
e620: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
e630: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
e640: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
e650: 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
e660: 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32  >pageSize = get2
e670: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
e680: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42  16]);.    if( pB
e690: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
e6a0: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
e6b0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
e6c0: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
e6d0: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
e6e0: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
e6f0: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
e700: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
e710: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
e720: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
e730: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
e740: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
e750: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
e760: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
e770: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
e780: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
e790: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
e7a0: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
e7b0: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
e7c0: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
e7d0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
e7e0: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
e7f0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
e800: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
e810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e820: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
e830: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
e840: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
e850: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
e860: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
e870: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
e880: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
e890: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
e8a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
e8b0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
e8c0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
e8d0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
e8e0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
e8f0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
e900: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
e910: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
e920: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
e930: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
e940: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
e950: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
e960: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
e970: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e980: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
e990: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
e9a0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
e9b0: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
e9c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e9d0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
e9e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
e9f0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
ea00: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
ea10: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
ea20: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
ea30: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
ea40: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
ea50: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
ea60: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
ea70: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
ea80: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
ea90: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
eaa0: 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
eab0: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
eac0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
ead0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
eae0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
eaf0: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
eb00: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
eb10: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
eb20: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
eb30: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
eb40: 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
eb50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
eb60: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
eb70: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
eb80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
eb90: 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
eba0: 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
ebb0: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
ebc0: 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
ebd0: 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
ebe0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
ebf0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
ec00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
ec10: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
ec20: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
ec30: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
ec40: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
ec50: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
ec60: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
ec70: 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ER);.      if( S
ec80: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
ec90: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
eca0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
ecb0: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
ecc0: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
ecd0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ece0: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
ecf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
ed00: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
ed10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ed20: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
ed30: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
ed40: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
ed50: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
ed60: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
ed70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ed80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ed90: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
eda0: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
edb0: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
edc0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
edd0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
ede0: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
edf0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
ee00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
ee10: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
ee20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ee30: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
ee40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
ee50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ee60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ee70: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ee80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ee90: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
eea0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
eeb0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
eec0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
eed0: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
eee0: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
eef0: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
ef00: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
ef10: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
ef20: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
ef30: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
ef40: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
ef50: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
ef60: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
ef70: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
ef80: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
ef90: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
efa0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
efb0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
efc0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
efd0: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
efe0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
eff0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
f000: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
f010: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
f020: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
f030: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
f040: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f050: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
f060: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
f070: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
f080: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
f090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
f0b0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
f0c0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
f0d0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f0e0: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
f0f0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
f100: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
f110: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
f120: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
f130: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
f140: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
f150: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
f160: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
f170: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
f180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f190: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
f1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f1c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f1d0: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
f1e0: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
f1f0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
f200: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f210: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
f220: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
f230: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
f240: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
f250: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f260: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
f270: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
f280: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
f290: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75   0;.  }.  if( mu
f2a0: 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
f2b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f2c0: 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
f2d0: 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
f2e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f2f0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
f300: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f310: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
f320: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
f330: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
f340: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
f350: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
f360: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
f370: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
f380: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
f390: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
f3a0: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
f3b0: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
f3c0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
f3d0: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
f3e0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
f3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f400: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
f410: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
f420: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
f430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f440: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
f450: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
f460: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
f470: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
f480: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
f490: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
f4a0: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
f4b0: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
f4c0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f4d0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f4e0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
f4f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f500: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
f510: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
f520: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
f530: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
f540: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f550: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f560: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
f570: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
f580: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f590: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
f5a0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
f5b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
f5c0: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
f5d0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f5e0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
f5f0: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
f600: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
f610: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
f620: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
f630: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
f640: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
f650: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
f660: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
f670: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
f680: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
f690: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
f6a0: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
f6b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f6c0: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
f6d0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
f6e0: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
f6f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f700: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
f710: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
f720: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
f730: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
f740: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
f750: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
f760: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
f770: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
f780: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
f790: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
f7a0: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
f7b0: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
f7c0: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
f7d0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
f7e0: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
f7f0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
f800: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
f810: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
f820: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
f830: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
f840: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
f850: 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
f860: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
f870: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
f880: 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
f890: 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
f8a0: 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
f8b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
f8c0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
f8d0: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
f8e0: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
f8f0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
f900: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
f910: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f920: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
f930: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
f940: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
f950: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
f960: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
f970: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f980: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
f990: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
f9a0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
f9b0: 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
f9c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
f9d0: 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
f9e0: 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
f9f0: 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
fa00: 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
fa10: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
fa20: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
fa30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
fa40: 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
fa50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fa60: 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
fa70: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
fa80: 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
fa90: 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
faa0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
fab0: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
fac0: 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
fad0: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
fae0: 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
faf0: 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
fb00: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
fb10: 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck(p);.  sqlite3
fb20: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
fb30: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
fb40: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
fb50: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
fb60: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
fb70: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
fb80: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
fb90: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
fba0: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
fbb0: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
fbc0: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
fbd0: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
fbe0: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
fbf0: 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
fc00: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
fc10: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
fc20: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
fc30: 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
fc40: 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
fc50: 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
fc60: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
fc70: 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
fc80: 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
fc90: 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
fca0: 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
fcb0: 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
fcc0: 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
fcd0: 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
fce0: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
fcf0: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
fd00: 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
fd10: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
fd20: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
fd30: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
fd40: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
fd50: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
fd60: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
fd70: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
fd80: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
fd90: 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  free(pBt->pSchem
fda0: 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
fdb0: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
fdc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
fdd0: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
fde0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
fdf0: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
fe00: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
fe10: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
fe20: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
fe30: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
fe40: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
fe50: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
fe60: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
fe70: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
fe80: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
fe90: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
fea0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
feb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fec0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
fed0: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
fee0: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
fef0: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
ff00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
ff10: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
ff20: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
ff30: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
ff40: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
ff50: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
ff60: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
ff70: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
ff80: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
ff90: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
ffa0: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
ffb0: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
ffc0: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
ffd0: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
ffe0: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
fff0: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
10000 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
10010 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
10020 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
10030 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
10040 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
10050 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
10060 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
10070 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
10080 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
10090 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
100a0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
100b0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
100c0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
100d0 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
100e0 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
100f0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
10100 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
10110 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
10120 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
10130 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
10140 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
10150 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
10160 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
10170 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
10180 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
10190 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
101a0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
101b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
101c0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
101d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
101e0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
101f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10200 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
10210 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
10220 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
10230 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
10240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
10260 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10270 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
10280 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
10290 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
102a0 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
102b0 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
102c0 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
102d0 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
102e0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
102f0 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
10300 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
10310 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
10320 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
10330 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
10340 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
10350 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
10360 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
10370 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
10380 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
10390 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
103a0 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
103b0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
103c0 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
103d0 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
103e0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
103f0 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
10400 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
10410 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
10420 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
10430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
10440 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
10450 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
10460 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
10470 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
10480 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
10490 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
104a0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
104b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
104c0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
104d0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
104e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
104f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
10500 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
10510 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
10520 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
10530 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10540 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10550 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
10560 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10570 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
10580 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
10590 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
105a0 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
105b0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
105c0 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
105d0 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
105e0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
105f0 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
10600 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
10610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10620 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
10630 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
10640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10650 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
10660 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
10670 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
10680 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
10690 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
106a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
106b0 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
106c0 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
106d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
106e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
106f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10700 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
10710 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
10720 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
10730 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
10740 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
10750 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
10760 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
10770 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
10780 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
10790 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
107a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
107b0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
107c0 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
107d0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
107e0 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
107f0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
10800 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
10810 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
10820 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
10830 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
10840 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
10850 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
10860 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
10870 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
10880 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
10890 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
108a0 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
108b0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
108c0 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
108d0 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
108e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
108f0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
10900 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
10910 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
10920 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
10930 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
10940 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
10950 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
10960 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10970 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
10980 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
10990 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
109a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
109b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
109c0 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
109d0 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
109e0 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
109f0 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
10a00 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53  0 then the pageS
10a10 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73  izeFixed flag is
10a20 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
10a30 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
10a40 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
10a50 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
10a60 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
10a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
10a80 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
10a90 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
10aa0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
10ab0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
10ac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
10ad0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
10ae0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10af0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
10b00 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
10b10 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
10b20 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10b30 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
10b40 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73  zeFixed ){.    s
10b50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10b60 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
10b70 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
10b80 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
10b90 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
10ba0 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
10bb0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
10bc0 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
10bd0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
10be0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
10bf0 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
10c00 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
10c10 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
10c20 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
10c30 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
10c40 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
10c50 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
10c60 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
10c70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
10c80 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
10c90 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
10ca0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
10cb0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
10cc0 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
10cd0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
10ce0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10cf0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
10d00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
10d10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
10d20 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
10d30 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
10d40 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
10d50 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
10d60 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70  f( iFix ) pBt->p
10d70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
10d80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10d90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
10da0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10db0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
10dc0 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
10dd0 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
10de0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
10df0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
10e00 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
10e10 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
10e20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10e30 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
10e40 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
10e50 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
10e60 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
10e70 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
10e80 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
10e90 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
10ea0 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
10eb0 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
10ec0 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  y extensions..*/
10ed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
10ee0 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
10ef0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
10f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10f10 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d  ter(p);.  n = p-
10f20 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
10f30 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
10f40 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ize;.  sqlite3Bt
10f50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10f60 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
10f70 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
10f80 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
10f90 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
10fa0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
10fb0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
10fc0 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
10fd0 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
10fe0 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
10ff0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
11000 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
11010 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
11020 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
11030 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
11040 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
11050 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11060 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
11070 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11080 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
11090 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
110a0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
110b0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
110c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
110d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
110e0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
110f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11100 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
11110 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11120 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
11130 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
11140 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
11150 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
11160 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
11170 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
11180 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
11190 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
111a0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
111b0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
111c0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
111d0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
111e0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
111f0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
11200 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
11210 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
11220 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11230 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
11240 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11250 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
11260 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
11270 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
11280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11290 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
112a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
112b0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
112c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
112d0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
112e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
112f0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
11300 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
11310 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11320 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
11330 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
11340 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
11350 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11360 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11370 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11390 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
113a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
113b0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
113c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
113d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
113e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
113f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11400 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
11410 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
11420 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
11430 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
11440 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
11450 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
11460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11470 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
11480 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
11490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
114a0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
114b0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
114c0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
114d0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
114e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
114f0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
11500 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
11510 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11520 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
11530 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
11540 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
11550 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
11560 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11570 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
11580 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11590 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
115a0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
115b0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
115c0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
115d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
115e0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
115f0 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
11600 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
11610 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
11620 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11630 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
11640 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
11650 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
11660 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
11670 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
11680 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
11690 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
116a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
116b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
116c0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
116d0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
116e0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
116f0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
11700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
11710 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
11720 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
11730 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11740 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
11750 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11760 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11770 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11780 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
11790 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
117a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
117b0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
117c0 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
117d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
117e0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
117f0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
11800 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
11810 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
11820 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
11830 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
11840 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
11850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11860 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
11870 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
11880 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
118a0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
118b0 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  iled;.  }else if
118c0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
118d0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20   int pageSize;. 
118e0 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
118f0 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
11900 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
11910 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
11920 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
11930 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
11940 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
11950 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
11960 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11970 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11980 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
11990 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
119a0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
119b0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
119c0 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
119d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
119e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
119f0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
11a00 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
11a10 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
11a20 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
11a30 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
11a40 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
11a50 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
11a60 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
11a70 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
11a80 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
11a90 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
11aa0 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
11ab0 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
11ac0 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
11ad0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
11ae0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
11af0 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
11b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
11b10 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
11b20 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
11b30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
11b40 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
11b50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
11b60 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
11b70 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
11b80 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
11b90 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
11ba0 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
11bb0 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
11bc0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11bd0 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
11be0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
11bf0 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
11c00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
11c10 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11c20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11c30 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
11c40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
11c50 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
11c60 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
11c70 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
11c80 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
11c90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
11ca0 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
11cb0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
11cc0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
11cd0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
11ce0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
11cf0 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
11d00 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
11d10 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
11d20 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
11d30 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
11d40 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
11d50 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
11d60 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
11d70 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
11d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
11d90 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
11da0 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
11db0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
11dc0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
11dd0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
11de0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
11df0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
11e00 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
11e10 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
11e20 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
11e30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
11e40 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
11e50 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
11e60 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
11e70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11e80 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11e90 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11ea0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
11ed0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
11ee0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
11ef0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11f00 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 72  _failed;.      r
11f10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11f20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
11f30 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b  sableSize<480 ){
11f40 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
11f50 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
11f60 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61     }.    pBt->pa
11f70 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
11f80 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
11f90 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75  >usableSize = (u
11fa0 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23  16)usableSize;.#
11fb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11fc0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
11fd0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
11fe0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
11ff0 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
12000 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
12010 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
12020 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
12030 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
12040 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
12050 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
12060 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
12070 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
12080 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
12090 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
120a0 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
120b0 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
120c0 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
120d0 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
120e0 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
120f0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
12100 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
12110 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
12120 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
12130 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
12140 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
12150 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
12160 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
12170 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
12180 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
12190 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
121a0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
121b0 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
121c0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
121d0 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
121e0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
121f0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
12200 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
12210 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ner, a header wh
12220 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
12230 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
12240 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
12250 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
12260 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
12270 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
12280 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
12290 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
122a0 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  xLocal = (pBt->u
122b0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
122c0 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
122d0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42  ->minLocal = (pB
122e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
122f0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20  )*32/255 - 23;. 
12300 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
12310 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
12320 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e  - 35;.  pBt->min
12330 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61  Leaf = (pBt->usa
12340 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
12350 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72  55 - 23;.  asser
12360 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
12370 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
12380 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
12390 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
123a0 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge1;.  return SQ
123b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
123c0 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
123d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
123e0 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
123f0 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
12400 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
12410 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
12420 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
12430 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
12440 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
12450 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
12460 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
12470 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
12480 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
12490 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
124a0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
124b0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
124c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
124d0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
124e0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
124f0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
12500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
12510 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
12520 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
12530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
12540 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
12550 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
12560 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
12570 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
12580 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12590 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
125a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
125b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
125c0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
125d0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
125e0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
125f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
12600 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
12610 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
12620 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12630 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
12640 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
12650 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
12660 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
12670 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12680 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
12690 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
126a0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
126b0 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
126c0 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
126d0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
126e0 65 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ew database by i
126f0 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
12700 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
12710 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
12720 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
12730 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
12740 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
12750 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
12760 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
12770 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67  t rc;.  int nPag
12780 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
12790 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
127a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
127b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
127c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
127d0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
127e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
127f0 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e  ITE_OK || nPage>
12800 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
12810 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
12820 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
12830 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
12840 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
12850 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
12860 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
12870 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
12880 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12890 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
128a0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
128b0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
128c0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
128d0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
128e0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
128f0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31  put2byte(&data[1
12900 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  6], pBt->pageSiz
12910 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  e);.  data[18] =
12920 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
12930 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
12940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
12950 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
12960 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
12970 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
12980 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
12990 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
129a0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
129b0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
129c0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
129d0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
129e0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
129f0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
12a00 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
12a10 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
12a20 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
12a30 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
12a40 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
12a50 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
12a60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12a70 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
12a80 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
12a90 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
12aa0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
12ab0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
12ac0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
12ad0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
12ae0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
12af0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
12b00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
12b10 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
12b20 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
12b30 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
12b40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
12b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12b60 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
12b70 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
12b80 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
12b90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
12ba0 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
12bb0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12bc0 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
12bd0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
12be0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12bf0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12c00 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
12c10 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
12c20 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
12c30 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
12c40 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
12c50 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
12c60 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
12c70 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
12c80 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
12c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
12ca0 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
12cb0 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
12cc0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
12cd0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
12ce0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
12cf0 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
12d00 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
12d10 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
12d20 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
12d30 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
12d40 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
12d50 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
12d60 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
12d70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
12d80 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
12d90 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
12da0 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
12db0 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
12dc0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
12dd0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
12de0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
12df0 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
12e00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
12e10 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
12e20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12e30 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
12e40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12e50 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
12e60 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12e70 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
12e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
12e90 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
12ea0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
12eb0 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
12ec0 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
12ed0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
12ee0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
12ef0 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
12f00 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
12f10 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
12f20 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
12f30 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
12f40 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12f50 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
12f60 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
12f70 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
12f80 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
12f90 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
12fa0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
12fb0 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
12fc0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
12fd0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
12fe0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
12ff0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13000 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
13010 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
13020 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
13030 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
13040 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
13050 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
13060 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
13070 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
13080 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
13090 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
130a0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
130b0 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
130c0 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
130d0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
130e0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
130f0 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
13100 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
13110 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
13120 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
13130 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
13140 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
13150 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
13160 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
13170 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
13180 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
13190 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
131a0 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
131b0 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
131c0 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
131d0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
131e0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
131f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13200 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
13210 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
13220 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
13230 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
13240 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13250 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
13260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13270 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13280 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
13290 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
132a0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
132b0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
132c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
132d0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
132e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
132f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
13300 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
13310 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
13320 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
13330 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
13340 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13350 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
13360 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
13370 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
13380 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
13390 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
133a0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
133b0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
133c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
133d0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
133e0 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
133f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
13400 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
13410 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
13420 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
13430 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
13440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13450 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
13460 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
13470 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
13480 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
13490 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
134a0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
134b0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
134c0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
134d0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
134e0 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
134f0 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
13500 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
13510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
13520 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
13530 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13540 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
13550 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  >isPending ){.  
13560 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
13570 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
13580 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
13590 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
135a0 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
135b0 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
135c0 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
135d0 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
135e0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
135f0 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
13600 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
13610 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
13620 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13630 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
13640 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
13650 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
13660 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
13670 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
13680 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
13690 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
136a0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
136b0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
136c0 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
136d0 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
136e0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
136f0 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
13700 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
13710 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
13720 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
13730 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
13740 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
13750 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
13760 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
13770 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
13780 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  pened. */.  if( 
13790 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
137a0 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
137b0 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
137c0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
137d0 4c 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f  LOCK)) ){.    go
137e0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
137f0 20 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20    }..  do {.    
13800 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
13810 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
13820 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
13830 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
13840 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
13850 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
13860 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
13870 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
13880 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
13890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
138a0 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
138b0 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
138c0 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
138d0 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
138e0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
138f0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
13900 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
13910 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
13920 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
13930 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
13940 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
13950 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
13960 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
13970 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
13980 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
13990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
139a0 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
139b0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
139c0 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
139d0 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
139e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
139f0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
13a00 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
13a10 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
13a20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
13a30 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
13a40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
13a50 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
13a60 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
13a70 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
13a80 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
13a90 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
13aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13ab0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13ac0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
13ad0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13ae0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
13af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
13b10 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
13b20 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
13b30 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
13b40 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
13b50 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13b60 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
13b70 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
13b80 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
13b90 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
13ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13bb0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13bc0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
13bd0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
13be0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
13bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13c00 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
13c10 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
13c20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c  ){..assert( p->l
13c30 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
13c40 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
13c50 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
13c60 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
13c70 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
13c80 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
13c90 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
13ca0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
13cb0 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
13cc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
13cd0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
13ce0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
13cf0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
13d00 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
13d10 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
13d20 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
13d30 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
13d40 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
13d50 73 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  s;.    }.#ifndef
13d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13d70 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66  RED_CACHE.    if
13d80 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
13d90 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
13da0 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
13db0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
13dc0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73  p;.      pBt->is
13dd0 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29  Exclusive = (u8)
13de0 28 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20  (wrflag>1);.    
13df0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74  }.#endif.  }...t
13e00 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
13e10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13e20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
13e30 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
13e40 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68  kes sure that th
13e50 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
13e60 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
13e70 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61  f.    ** open sa
13e80 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65  vepoints. If the
13e90 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
13ea0 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
13eb0 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  n 0 and.    ** t
13ec0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
13ed0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
13ee0 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
13ef0 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
13f00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
13f10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13f20 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
13f30 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
13f40 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
13f50 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
13f60 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  y(p);.  sqlite3B
13f70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13f80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
13f90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fa0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a  T_AUTOVACUUM../*
13fb0 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e  .** Set the poin
13fc0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
13fd0 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  for all children
13fe0 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20   of page pPage. 
13ff0 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67  Also, if.** pPag
14000 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73  e contains cells
14010 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
14020 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73  verflow pages, s
14030 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  et the pointer.*
14040 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  * map entries fo
14050 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
14060 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  ages as well..*/
14070 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43  .static int setC
14080 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50  hildPtrmaps(MemP
14090 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
140a0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140c0 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72    /* Counter var
140d0 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  iable */.  int n
140e0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
140f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14100 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
14110 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a   in page pPage *
14120 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
14130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14140 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
14150 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61   code */.  BtSha
14160 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
14170 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e  ->pBt;.  u8 isIn
14180 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
14190 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70  isInit;.  Pgno p
141a0 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
141b0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
141c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
141d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
141e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
141f0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
14200 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
14210 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14220 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
14230 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14240 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
14250 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
14260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
14270 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
14280 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
14290 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
142a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
142b0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
142c0 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
142d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
142e0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63        goto set_c
142f0 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
14300 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
14310 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
14320 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
14330 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
14340 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72  (pCell);.      r
14350 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
14360 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
14370 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
14380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
143a0 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
143b0 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  aps_out;.    }. 
143c0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
143d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
143e0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
143f0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
14400 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
14410 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
14420 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
14430 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
14440 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
14450 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  o);.  }..set_chi
14460 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
14470 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
14480 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
14490 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
144a0 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
144b0 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
144c0 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
144d0 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
144e0 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
144f0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
14500 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
14510 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
14520 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
14530 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
14540 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
14550 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
14560 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
14570 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
14580 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
14590 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
145a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
145b0 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
145c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
145d0 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
145e0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
145f0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
14600 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
14610 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
14620 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
14630 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
14640 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
14650 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
14660 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
14670 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
14680 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
14690 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
146a0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
146b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
146d0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
146e0 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
146f0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
14700 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
14710 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
14720 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
14730 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14740 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14750 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14770 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
14780 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
14790 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
147a0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
147b0 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
147c0 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
147d0 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
147e0 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
147f0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
14800 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
14810 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
14820 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
14830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14840 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14850 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
14860 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
14870 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
14880 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14890 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
148a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
148b0 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
148c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
148d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
148e0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
148f0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
14900 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
14910 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
14920 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
14930 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
14940 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
14950 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
14960 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
14970 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
14980 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
14990 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
149a0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
149b0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
149c0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
149d0 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
149e0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
149f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
14a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14a10 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
14a20 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
14a30 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
14a40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14a60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14a70 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
14a80 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
14a90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
14aa0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
14ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14ac0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14ae0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
14af0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
14b00 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
14b10 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
14b20 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14b30 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14b40 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
14b50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
14b60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
14b70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
14b80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14b90 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
14ba0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14bb0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
14bc0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
14bd0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
14be0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14bf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14c00 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
14c10 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
14c20 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
14c30 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
14c40 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
14c50 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
14c60 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
14c70 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
14c80 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
14c90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14ca0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
14cb0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
14cc0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
14cd0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
14ce0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
14cf0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
14d00 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14d10 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
14d20 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
14d30 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
14d40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
14d50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
14d60 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
14d70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
14d80 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
14d90 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
14da0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
14db0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
14dc0 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
14dd0 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
14de0 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
14df0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
14e00 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
14e10 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
14e20 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
14e30 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
14e40 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
14e50 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
14e60 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
14e70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14e80 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
14e90 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
14ea0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
14eb0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
14ec0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
14ed0 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
14ee0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14ef0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
14f10 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
14f20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
14f30 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
14f40 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
14f50 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
14f60 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
14f70 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
14f80 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
14f90 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
14fa0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
14fb0 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
14fc0 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
14fd0 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
14fe0 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
14ff0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15000 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
15010 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
15020 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
15030 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
15040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
15060 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
15070 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
15080 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
15090 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
150a0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
150b0 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
150c0 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
150d0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
150e0 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
150f0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
15100 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
15110 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
15120 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
15130 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
15140 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
15150 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
15160 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15170 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
15180 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
15190 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
151a0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
151b0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
151c0 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
151d0 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
151e0 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
151f0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
15200 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
15210 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
15220 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
15230 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
15240 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
15250 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
15260 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
15270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15290 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
152a0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
152b0 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
152c0 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
152d0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
152e0 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
152f0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
15300 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
15310 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
15320 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
15330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15370 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
15380 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
15390 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
153a0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
153b0 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
153c0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
153d0 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
153e0 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
153f0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
15400 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
15410 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
15420 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15430 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15440 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
15450 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
15460 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
15470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
15490 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
154a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
154b0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
154c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
154d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
154e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
154f0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
15500 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
15510 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
15520 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
15530 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
15540 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15550 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
15560 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15570 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
15580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15590 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
155a0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
155b0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
155c0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
155d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
155e0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
155f0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
15600 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
15610 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
15620 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
15630 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
15640 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
15650 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
15660 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
15670 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
15680 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
15690 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
156a0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
156b0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
156c0 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
156d0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
156e0 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
156f0 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
15700 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
15710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15720 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
15730 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
15740 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
15750 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
15760 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15770 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
15780 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
15790 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
157a0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
157b0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
157c0 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
157d0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
157e0 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
157f0 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
15800 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
15810 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
15820 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
15830 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
15840 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
15850 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
15860 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
15870 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
15880 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
15890 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
158a0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
158b0 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
158c0 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
158d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
158e0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
158f0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
15900 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
15910 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  Pg){.  Pgno nFre
15920 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
15930 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15940 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
15950 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
15960 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15970 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15980 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15990 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
159a0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
159b0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
159c0 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
159d0 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
159e0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
159f0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
15a00 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
15a10 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
15a20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
15a30 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
15a40 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
15a50 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
15a60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
15a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15a80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
15a90 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
15aa0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
15ab0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
15ac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15ae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15af0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15b00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
15b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15b20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15b30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15b40 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
15b50 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
15b60 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
15b70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
15b80 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
15b90 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
15ba0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
15bb0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
15bc0 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
15bd0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
15be0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
15bf0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
15c00 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
15c10 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
15c20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
15c30 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
15c40 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
15c50 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
15c60 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
15c70 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
15c80 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
15c90 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
15ca0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
15cb0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
15cc0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
15cd0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
15ce0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
15cf0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
15d00 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
15d10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15d20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
15d30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
15d40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d50 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
15d60 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
15d70 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
15d80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
15d90 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
15da0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
15db0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15dc0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
15dd0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
15de0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
15df0 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
15e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15e10 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
15e20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
15e30 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
15e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15e50 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15e60 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
15e70 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
15e80 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
15e90 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
15ea0 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
15eb0 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
15ec0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
15ed0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
15ee0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
15ef0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
15f00 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
15f10 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
15f20 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
15f30 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
15f40 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
15f50 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
15f60 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
15f70 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
15f80 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
15f90 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
15fa0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
15fb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
15fc0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
15fd0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
15fe0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
15ff0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
16000 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
16010 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
16020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16040 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16050 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
16060 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16080 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
16090 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
160a0 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
160b0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
160c0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
160d0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
160e0 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
160f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16100 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
16110 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
16120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16130 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
16140 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
16150 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
16160 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
16170 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
16180 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
16190 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
161a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
161b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
161d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
161e0 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
161f0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
16200 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
16210 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
16220 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
16230 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
16240 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
16250 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
16260 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
16270 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
16280 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
16290 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
162a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
162b0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
162c0 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
162d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
162e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
162f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
16310 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16320 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
16330 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
16340 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
16350 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16370 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16390 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
163a0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
163b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
163c0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
163d0 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
163e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
163f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16400 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
16410 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
16420 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
16430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
16440 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
16450 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
16460 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
16470 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
16480 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
16490 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
164a0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
164b0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
164c0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
164d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
164e0 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
164f0 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
16500 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
16510 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
16520 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16530 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
16540 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
16550 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
16560 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
16570 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16580 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
16590 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
165a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
165b0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
165c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
165d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
165e0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
165f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
16600 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
16610 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
16620 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
16630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
16640 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
16650 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
16660 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
16670 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
16680 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16690 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
166a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
166b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
166c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
166d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
166e0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
166f0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
16700 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
16710 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
16720 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
16730 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
16740 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16750 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
16760 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
16770 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16780 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
16790 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
167a0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
167b0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
167c0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
167d0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
167e0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
167f0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
16800 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
16810 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
16820 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
16830 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
16840 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
16850 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
16860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16870 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16880 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
16890 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
168a0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
168b0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
168c0 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
168d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
168e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
168f0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
16900 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
16910 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
16920 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
16930 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
16940 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
16950 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
16960 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
16970 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
16980 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
16990 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
169a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
169b0 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
169c0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
169d0 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
169e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
169f0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
16a00 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
16a10 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
16a20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
16a30 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
16a40 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
16a50 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
16a60 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
16a70 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
16a80 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
16a90 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
16aa0 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
16ab0 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
16ac0 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
16ad0 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
16ae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16b00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16b10 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
16b20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
16b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
16b40 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d  );.    nPtrmap =
16b50 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
16b60 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
16b70 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f   nOrig)+pgsz/5)/
16b80 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46  (pgsz/5);.    nF
16b90 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
16ba0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
16bb0 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
16bc0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16bd0 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
16be0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16bf0 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
16c00 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  -;.    }.    whi
16c10 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
16c20 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
16c30 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
16c40 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
16c50 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
16c60 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e    }.    if( nFin
16c70 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
16c80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16c90 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46  KPT;..    for(iF
16ca0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
16cb0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
16cc0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
16cd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
16ce0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
16cf0 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20   nFin, iFree);. 
16d00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
16d10 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
16d20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
16d30 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
16d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16d50 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  OK;.      rc = s
16d60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16d70 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
16d80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
16d90 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
16da0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
16db0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
16dc0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16dd0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
16de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16df0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
16e00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
16e10 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
16e20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16e40 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
16e50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
16e60 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
16e70 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
16e80 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
16e90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ea0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
16eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16ec0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
16ed0 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
16ee0 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
16ef0 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
16f00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16f10 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
16f20 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
16f30 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
16f40 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
16f50 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
16f60 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
16f70 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
16f80 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
16f90 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
16fa0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
16fb0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
16fc0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
16fd0 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
16fe0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
16ff0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
17000 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
17010 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
17020 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
17030 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
17040 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
17050 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
17060 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
17070 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
17080 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
17090 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
170a0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
170b0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
170c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
170d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
170e0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
170f0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
17100 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
17110 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
17120 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
17130 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
17140 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
17150 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
17160 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
17170 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
17180 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
17190 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
171a0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
171b0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
171c0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
171d0 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
171e0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
171f0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
17200 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
17210 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
17220 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
17230 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
17240 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17250 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
17260 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
17270 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
17280 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
172a0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
172b0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
172c0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
172d0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
172e0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
172f0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
17300 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
17310 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
17320 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
17330 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
17340 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
17350 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
17360 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
17370 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
17380 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
17390 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
173a0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
173b0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
173c0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
173d0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
173e0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
173f0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
17400 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
17410 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
17420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
17430 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
17440 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
17450 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17460 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
17470 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
17480 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
17490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
174a0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
174b0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
174c0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
174d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
174e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
174f0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
17500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17510 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
17520 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17530 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
17540 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
17550 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
17560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
17580 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
17590 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
175a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
175b0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
175c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
175d0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
175e0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
175f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
17600 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
17610 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17620 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17630 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
17640 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
17650 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
17660 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
17670 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
17680 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
17690 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
176a0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
176b0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
176c0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
176d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
176e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
176f0 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  sr;.  assert( sq
17700 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
17710 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a  utex(p) );..  /*
17720 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 63 75   Search for a cu
17730 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e 20 62  rsor held open b
17740 79 20 74 68 69 73 20 62 2d 74 72 65 65 20 63 6f  y this b-tree co
17750 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65  nnection. If one
17760 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68   exists,.  ** th
17770 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
17780 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67  on will be downg
17790 72 61 64 65 64 20 74 6f 20 61 20 72 65 61 64 2d  raded to a read-
177a0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
177b0 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  .  ** instead of
177c0 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75   actually conclu
177d0 64 65 64 2e 20 41 20 73 75 62 73 65 71 75 65 6e  ded. A subsequen
177e0 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74  t call to Commit
177f0 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a  PhaseTwo() .  **
17800 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77   or Rollback() w
17810 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20 74  ill finish the t
17820 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
17830 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
17840 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43  se.  */.  for(pC
17850 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  sr=pBt->pCursor;
17860 20 70 43 73 72 20 26 26 20 70 43 73 72 2d 3e 70   pCsr && pCsr->p
17870 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72 3d 70  Btree!=p; pCsr=p
17880 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61  Csr->pNext);.  a
17890 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30 20 7c  ssert( pCsr==0 |
178a0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  | p->inTrans>TRA
178b0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74  NS_NONE );..  bt
178c0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
178d0 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70  nt(pBt);.  if( p
178e0 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67  Csr ){.    downg
178f0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
17900 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
17910 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
17920 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
17930 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
17940 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
17950 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
17960 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
17970 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
17980 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17990 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
179a0 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
179b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
179c0 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
179d0 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
179e0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
179f0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
17a00 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
17a10 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
17a20 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
17a30 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
17a40 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
17a50 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
17a60 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
17a70 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
17a80 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
17a90 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
17aa0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
17ab0 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
17ac0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
17ad0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17ae0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
17af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17b00 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
17b10 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
17b20 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
17b30 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
17b40 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
17b50 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
17b60 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
17b70 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
17b80 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
17b90 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
17ba0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
17bb0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17bc0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
17bd0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17be0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
17bf0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
17c00 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
17c10 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
17c20 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17c30 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
17c40 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
17c50 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
17c60 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
17c70 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17c80 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
17c90 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
17ca0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
17cb0 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
17cc0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
17cd0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
17ce0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17cf0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
17d00 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
17d10 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
17d20 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17d30 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
17d40 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
17d50 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
17d60 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
17d70 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
17d80 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
17d90 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
17da0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
17db0 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
17dc0 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
17dd0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
17de0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17df0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
17e00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
17e10 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
17e20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
17e30 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
17e40 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
17e50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17e60 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
17e70 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
17e80 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
17e90 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
17ea0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
17eb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17ec0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
17ed0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17ee0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17ef0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17f00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
17f10 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
17f20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
17f30 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
17f40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
17f50 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
17f60 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
17f70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
17f80 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
17f90 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
17fa0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
17fb0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
17fc0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
17fd0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
17fe0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17ff0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
18000 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
18010 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
18020 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
18030 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18040 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
18050 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
18060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
18080 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
180a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
180b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
180c0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
180d0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
180e0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
180f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18100 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18120 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
18130 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
18140 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18150 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
18160 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
18170 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18180 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
18190 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
181a0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
181b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
181c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
181d0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
181e0 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
181f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18200 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18210 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
18220 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
18230 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18240 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
18250 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
18260 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
18270 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
18280 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
18290 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
182a0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
182b0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
182c0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
182d0 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
182e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
182f0 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
18300 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
18310 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
18320 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
18330 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
18340 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
18350 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
18360 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
18370 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
18380 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
18390 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
183a0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
183b0 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
183c0 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
183d0 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
183e0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
183f0 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
18400 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
18410 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
18420 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
18430 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
18440 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18450 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
18460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
18470 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
18480 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
18490 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
184a0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
184b0 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
184c0 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
184d0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
184e0 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
184f0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
18500 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
18510 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
18520 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
18530 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
18540 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
18550 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
18560 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
18570 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
18580 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
18590 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
185a0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
185b0 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
185c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
185d0 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
185e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
185f0 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
18600 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
18610 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
18620 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
18630 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
18640 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
18650 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
18660 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
18670 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
18680 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
18690 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
186a0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
186b0 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
186c0 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
186d0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
186e0 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
186f0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
18700 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
18710 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
18720 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
18730 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
18740 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
18750 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
18760 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
18770 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
18780 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
18790 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
187a0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
187b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
187c0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
187d0 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
187e0 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
187f0 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
18800 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
18810 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
18820 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
18830 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
18840 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
18850 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
18860 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18870 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
18880 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
18890 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
188a0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
188b0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
188c0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
188d0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
188e0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
188f0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
18900 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
18910 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
18920 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
18930 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
18940 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
18950 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
18960 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
18970 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
18980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18990 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
189a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
189b0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
189c0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
189d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
189e0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
189f0 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
18a00 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
18a10 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18a20 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
18a30 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
18a40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18a50 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
18a60 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
18a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18a80 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
18a90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
18ab0 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
18ac0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
18ad0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
18ae0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
18af0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
18b00 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
18b10 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
18b20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
18b30 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
18b40 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
18b50 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
18b60 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
18b70 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
18b80 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
18b90 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
18ba0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
18bb0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
18bc0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
18bd0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
18be0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
18bf0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
18c00 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
18c10 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
18c20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
18c30 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
18c40 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
18c50 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
18c60 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
18c70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
18c80 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
18c90 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
18ca0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
18cb0 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
18cc0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
18cd0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
18ce0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
18cf0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
18d00 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
18d10 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
18d20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
18d30 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
18d40 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
18d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18d60 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
18d70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
18d80 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
18d90 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
18da0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
18db0 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
18dc0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
18dd0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
18de0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
18df0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
18e00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
18e10 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
18e20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
18e30 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
18e40 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
18e50 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
18e60 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
18e70 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18e80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
18e90 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
18ea0 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
18eb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18ec0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
18ed0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18ee0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18f00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18f10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
18f20 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
18f30 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
18f40 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
18f50 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
18f60 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
18f70 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
18f80 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
18f90 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
18fa0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
18fb0 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
18fc0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
18fd0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
18fe0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
18ff0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
19000 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
19010 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
19020 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
19030 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
19040 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
19050 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
19060 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
19070 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
19080 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
19090 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
190a0 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
190b0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
190c0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
190d0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
190e0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
190f0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
19100 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
19110 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
19120 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
19130 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
19140 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
19150 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
19160 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
19170 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
19180 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
19190 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
191a0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
191b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
191c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
191d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
191e0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
191f0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
19200 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
19210 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
19220 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
19230 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
19240 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
19250 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
19260 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
19270 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
19280 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
19290 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
192a0 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
192b0 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
192c0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
192d0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
192e0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
192f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
19300 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
19310 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
19320 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
19330 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
19340 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19350 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
19360 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19370 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
19380 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19390 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
193a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
193b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
193c0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
193d0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
193e0 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
193f0 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
19400 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
19410 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
19420 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
19430 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
19440 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
19450 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
19460 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19470 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
19480 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
19490 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
194a0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
194b0 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
194c0 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
194d0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
194e0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
194f0 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
19500 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
19510 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
19520 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
19530 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
19540 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
19550 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
19560 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
19570 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
19580 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
19590 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
195a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
195b0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
195c0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
195d0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
195e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
195f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19610 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
19620 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
19630 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
19640 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
19650 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
19660 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
19670 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
19680 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
19690 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
196a0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
196b0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
196c0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
196d0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
196e0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
196f0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
19700 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
19710 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
19720 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
19730 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
19740 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
19750 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
19760 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
19770 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
19780 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
19790 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
197a0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
197b0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
197c0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
197d0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
197e0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
197f0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
19800 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
19810 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
19820 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
19830 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
19840 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19850 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
19860 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
19870 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
19880 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19890 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
198a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
198b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
198c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
198d0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
198e0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
198f0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
19900 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19910 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
19920 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
19930 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
19940 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
19950 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
19960 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19970 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
19980 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19990 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
199a0 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
199b0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
199c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
199d0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
199e0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
199f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
19a00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
19a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19a20 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
19a30 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
19a40 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
19a50 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
19a60 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
19a70 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
19a80 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
19a90 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
19aa0 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
19ab0 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
19ac0 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
19ad0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
19ae0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
19af0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
19b00 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
19b10 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
19b20 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
19b30 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
19b40 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
19b50 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
19b60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
19b70 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
19b80 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
19b90 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
19ba0 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
19bb0 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
19bc0 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
19bd0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
19be0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
19bf0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
19c00 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
19c10 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
19c20 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
19c30 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
19c40 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
19c50 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
19c60 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
19c70 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
19c80 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
19c90 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
19ca0 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
19cb0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
19cc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
19cd0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
19ce0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
19cf0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
19d00 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
19d10 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
19d20 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
19d30 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
19d40 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
19d50 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
19d60 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
19d70 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
19d80 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
19d90 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
19da0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
19db0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
19dc0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
19dd0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
19de0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
19df0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
19e00 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
19e10 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
19e20 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
19e30 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
19e40 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
19e50 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
19e60 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
19e70 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
19e80 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
19e90 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
19ea0 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
19eb0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
19ec0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
19ed0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
19ee0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
19ef0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
19f00 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
19f10 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
19f20 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
19f30 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73  rsorSize() bytes
19f40 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70   of memory .** p
19f50 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75  ointed to by pCu
19f60 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f  r have been zero
19f70 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
19f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19f90 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
19fa0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
19fd0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
19fe0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a000 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1a010 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1a020 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a040 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1a050 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1a060 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a070 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a080 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a090 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1a0a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1a0b0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1a0c0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0e0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1a0f0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1a100 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a110 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1a120 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1a130 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1a140 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1a150 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1a160 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1a170 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1a180 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1a190 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1a1a0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1a1b0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1a1c0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1a1d0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1a1e0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1a1f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1a200 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1a210 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1a220 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1a230 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1a240 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1a250 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1a260 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1a270 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1a280 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1a290 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1a2a0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1a2b0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1a2c0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1a2d0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1a2e0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1a2f0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1a300 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1a310 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1a320 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1a330 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1a340 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1a350 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1a360 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1a370 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1a380 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a390 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1a3a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1a3b0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1a3c0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1a3d0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70  EVER(wrFlag && p
1a3e0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
1a3f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a400 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1a410 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1a420 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75   && pagerPagecou
1a430 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1a440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a450 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EMPTY;.  }..  /*
1a460 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1a470 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1a480 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1a490 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1a4a0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1a4b0 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1a4c0 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1a4d0 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1a4e0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1a4f0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1a500 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1a510 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1a520 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1a530 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1a540 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1a550 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1a560 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1a570 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1a580 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1a590 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1a5a0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1a5b0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1a5c0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1a5d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1a5e0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1a5f0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1a600 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1a610 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1a620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a630 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1a640 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1a650 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a680 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1a690 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1a6c0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1a6d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1a6e0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a700 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1a710 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1a720 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a730 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a740 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a750 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1a760 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1a770 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1a780 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1a7b0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1a7c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1a7d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a7e0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1a7f0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1a800 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1a810 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1a820 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a840 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a850 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1a860 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1a870 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1a880 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1a890 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1a8a0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1a8b0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1a8c0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1a8d0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1a8e0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1a8f0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1a900 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1a910 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1a920 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1a930 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1a940 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1a950 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1a960 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a970 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1a980 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65  ){.  return size
1a990 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a  of(BtCursor);.}.
1a9a0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1a9b0 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1a9c0 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1a9d0 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1a9e0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1a9f0 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1aa00 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1aa10 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1aa20 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1aa30 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1aa40 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1aa50 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1aa60 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1aa70 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1aa80 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1aa90 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1aaa0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1aab0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1aac0 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1aad0 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1aae0 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1aaf0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1ab00 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1ab10 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1ab20 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1ab30 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1ab40 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1ab50 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1ab60 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1ab70 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1ab80 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1ab90 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1aba0 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1abb0 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1abc0 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1abd0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1abe0 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1abf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1ac00 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1ac10 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1ac20 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1ac30 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1ac40 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1ac50 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1ac60 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ac70 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1ac80 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1ac90 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1aca0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1acb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1acc0 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1acd0 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1ace0 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1acf0 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1ad00 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1ad10 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1ad20 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1ad30 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1ad40 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1ad50 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1ad60 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1ad70 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1ad80 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1ad90 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1ada0 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1adb0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1adc0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1add0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1ade0 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1adf0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ae00 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1ae10 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1ae20 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1ae30 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1ae40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ae50 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1ae60 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1ae70 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1ae80 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1ae90 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1aea0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1aeb0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1aec0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1aed0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1aee0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1aef0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1af00 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1af10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1af20 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1af30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1af40 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1af50 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1af60 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1af70 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1af80 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1af90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1afa0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1afb0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1afc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1afd0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1afe0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1aff0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1b000 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1b010 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1b020 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1b030 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b040 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1b050 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1b060 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1b070 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1b080 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1b090 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1b0a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1b0b0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1b0c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1b0d0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1b0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b0f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b100 53 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  ST./*.** Make a 
1b110 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
1b120 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74   by filling in t
1b130 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65  he fields of pTe
1b140 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65  mpCur..** The te
1b150 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
1b160 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
1b170 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65  sor list for the
1b180 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20   Btree..*/.void 
1b190 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
1b1a0 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
1b1b0 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
1b1c0 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
1b1d0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b1e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b1f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
1b200 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
1b210 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75  Cur, sizeof(BtCu
1b220 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  rsor));.  pTempC
1b230 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
1b240 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
1b250 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
1b260 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50   i<=pTempCur->iP
1b270 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
1b280 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
1b290 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  TempCur->apPage[
1b2a0 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
1b2b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d  }.  assert( pTem
1b2c0 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b  pCur->pKey==0 );
1b2d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b2e0 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66  ITE_TEST */..#if
1b2f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b300 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
1b310 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
1b320 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
1b330 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
1b340 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
1b350 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
1b360 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b370 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
1b380 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
1b390 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
1b3a0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
1b3b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b3c0 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ur) );.  for(i=0
1b3d0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1b3e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1b3f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
1b400 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
1b410 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73  DbPage);.  }.  s
1b420 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1b430 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69  ->pKey);.}.#endi
1b440 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1b450 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   */../*.** Make 
1b460 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1b470 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1b480 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1b490 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1b4a0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1b4b0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1b4c0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1b4d0 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  ll.** sqlite3Btr
1b4e0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1b4f0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1b500 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1b510 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1b520 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1b530 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1b540 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1b550 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1b560 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1b570 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
1b580 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1b590 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1b5a0 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1b5b0 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1b5c0 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1b5d0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1b5e0 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1b5f0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1b600 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1b610 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1b620 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1b630 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1b640 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1b650 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1b660 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1b670 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1b680 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1b690 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1b6a0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1b6b0 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1b6c0 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1b6d0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1b6e0 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1b6f0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1b700 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1b710 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1b720 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1b730 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1b740 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1b750 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1b760 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1b770 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1b780 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1b790 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1b7a0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1b7b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1b7c0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
1b7d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1b7e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1b7f0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1b800 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1b810 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1b820 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1b830 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1b840 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1b850 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1b860 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1b870 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1b880 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1b890 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1b8a0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1b8b0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1b8c0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1b8d0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1b8e0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1b8f0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1b900 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1b910 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1b920 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1b930 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1b940 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1b950 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1b960 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1b970 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1b980 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1b990 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1b9a0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1b9b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1b9c0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1b9d0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1b9e0 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1b9f0 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1ba00 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1ba10 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1ba20 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1ba30 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1ba40 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1ba50 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20               \. 
1ba90 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1baa0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1bae0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1baf0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bb30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bb40 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1bb50 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1bb60 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1bb70 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1bb80 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1bb90 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1bc30 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc70 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1bc80 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1bc90 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1bca0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1bcb0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
1bcc0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
1bcd0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
1bce0 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
1bcf0 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
1bd00 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1bd10 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
1bd20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
1bd30 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1bd40 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
1bd50 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
1bd60 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
1bd70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bd80 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
1bd90 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
1bda0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1bdb0 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
1bdc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1bdd0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1bde0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1bdf0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1be00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1be10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1be20 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1be30 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1be40 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1be50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1be70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1be80 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1be90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1bea0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
1beb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1bec0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1bed0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
1bee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bef0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1bf00 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
1bf10 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1bf20 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
1bf30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bf40 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1bf50 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1bf60 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1bf70 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1bf80 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1bf90 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
1bfa0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
1bfb0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
1bfc0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1bfd0 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
1bfe0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1bff0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
1c000 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
1c010 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
1c020 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
1c030 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1c040 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
1c050 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1c060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c070 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1c080 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c090 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
1c0a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1c0b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1c0c0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1c0d0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1c0e0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1c0f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c100 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1c110 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c120 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1c130 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c140 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1c150 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1c160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1c170 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
1c180 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
1c190 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
1c1a0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
1c1b0 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
1c1c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1c1d0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1c1e0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1c1f0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1c200 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
1c210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1c230 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c240 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
1c250 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1c260 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
1c270 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
1c280 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
1c290 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1c2a0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c2b0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
1c2c0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
1c2d0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
1c2e0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
1c2f0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
1c300 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
1c310 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
1c320 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
1c330 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
1c340 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
1c350 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c360 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
1c370 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c380 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
1c390 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
1c3a0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1c3b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1c3c0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
1c3d0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
1c3e0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
1c3f0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
1c400 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1c410 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
1c420 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
1c430 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1c440 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
1c450 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
1c460 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
1c470 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
1c480 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
1c490 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
1c4a0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
1c4b0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
1c4c0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1c4d0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
1c4e0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
1c4f0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1c500 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1c510 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
1c520 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
1c530 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
1c540 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
1c550 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
1c560 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
1c570 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
1c580 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
1c590 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
1c5a0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
1c5b0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
1c5c0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
1c5d0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1c5e0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
1c5f0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1c600 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
1c610 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1c620 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1c630 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
1c640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1c650 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
1c660 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
1c670 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1c680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c690 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1c6a0 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1c6b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1c6c0 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1c6d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1c6e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1c6f0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1c700 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1c710 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1c720 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c730 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1c740 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c750 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c760 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1c770 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1c780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c790 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1c7a0 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1c7b0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1c7c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1c7d0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1c7e0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1c7f0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1c800 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1c810 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1c820 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1c830 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1c840 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1c850 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1c860 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1c870 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1c880 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1c890 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1c8a0 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1c8b0 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1c8c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1c8d0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1c8e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1c8f0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1c900 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1c910 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1c920 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1c930 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1c940 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1c950 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1c960 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1c970 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1c980 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1c990 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1c9a0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1c9b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1c9c0 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1c9d0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1c9e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c9f0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1ca00 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1ca10 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1ca20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1ca30 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1ca40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1ca50 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1ca60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ca70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ca80 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1ca90 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1caa0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1cab0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1cac0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1cad0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1cae0 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1caf0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1cb00 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1cb10 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1cb20 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1cb30 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1cb40 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1cb50 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1cb60 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1cb70 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1cb80 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1cb90 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1cba0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1cbb0 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1cbc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1cbd0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1cbe0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1cbf0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1cc00 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1cc10 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1cc20 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1cc30 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1cc40 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1cc50 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1cc60 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1cc70 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1cc80 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1cc90 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1cca0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1ccb0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1ccc0 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1ccd0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1cce0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1ccf0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1cd00 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1cd10 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1cd20 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1cd30 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1cd40 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1cd50 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1cd60 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1cd70 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1cd80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1cd90 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1cda0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1cdb0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1cdc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1cdd0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1cde0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1cdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1ce00 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1ce10 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ce30 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ce40 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1ce50 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1ce60 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1ce70 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1ce80 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1ce90 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1cea0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1ceb0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1cec0 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1ced0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1cee0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1cef0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1cf00 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1cf10 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1cf20 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1cf30 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1cf40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1cf50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cf70 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1cf80 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1cf90 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1cfa0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1cfb0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1cfc0 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1cfd0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1cfe0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1cff0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1d000 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d010 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1d020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d030 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1d040 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1d050 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1d060 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1d070 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1d080 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1d090 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1d0a0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1d0b0 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1d0c0 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1d0d0 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1d0e0 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1d0f0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1d100 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1d110 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1d120 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1d130 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1d140 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1d150 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1d160 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1d170 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1d180 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1d190 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1d1a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d1b0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1d1c0 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1d1d0 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1d1e0 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1d1f0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1d200 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1d210 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1d220 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1d230 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1d240 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1d250 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1d260 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1d270 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1d280 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1d290 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1d2a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1d2b0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d2c0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1d2d0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1d2e0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1d2f0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1d300 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1d310 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1d320 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1d330 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1d340 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1d350 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1d360 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1d370 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1d380 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1d390 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1d3a0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1d3b0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1d3c0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1d3d0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1d3e0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1d3f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1d400 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1d410 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1d420 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1d430 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1d440 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1d450 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1d460 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1d470 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1d480 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1d490 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1d4a0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1d4b0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1d4c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1d4d0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1d4e0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1d4f0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1d500 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1d510 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1d520 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1d530 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1d540 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1d550 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1d560 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1d570 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1d580 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1d590 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1d5a0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1d5b0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1d5c0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1d5d0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1d5e0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1d5f0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1d600 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1d610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d620 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1d630 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1d640 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1d650 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1d660 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1d670 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1d680 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1d690 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1d6a0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1d6b0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1d6c0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1d6d0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1d6e0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1d6f0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1d700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1d710 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1d720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1d730 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1d740 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1d750 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1d760 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d770 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1d780 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1d790 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1d7a0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1d7b0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1d7c0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1d7d0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1d7e0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1d7f0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1d800 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d810 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d820 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1d830 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d840 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1d850 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1d860 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d870 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1d880 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1d890 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1d8a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1d8b0 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1d8c0 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1d8d0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1d8e0 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1d8f0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1d900 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1d910 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1d920 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1d930 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1d940 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1d950 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1d960 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1d970 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1d980 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1d990 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1d9a0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1d9b0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1d9c0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1d9d0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1d9e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d9f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1da00 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1da10 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1da20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1da30 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1da40 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1da50 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1da60 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1da70 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1da80 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1da90 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1daa0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1dab0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1dac0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1dad0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1dae0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1daf0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1db00 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1db10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1db20 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1db30 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1db40 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1db50 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1db60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1db70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1db80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1db90 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1dba0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1dbb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1dbc0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1dbd0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1dbe0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1dbf0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1dc00 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1dc10 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1dc20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1dc30 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1dc40 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1dc50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1dc60 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1dc70 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1dc80 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1dc90 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1dca0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1dcb0 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1dcc0 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1dcd0 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1dce0 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1dcf0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1dd00 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1dd10 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1dd20 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1dd30 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1dd40 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1dd50 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1dd60 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1dd70 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1dd80 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1dd90 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1dda0 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1ddb0 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1ddc0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1ddd0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1dde0 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1ddf0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1de00 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1de10 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1de20 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1de30 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1de40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1de50 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1de60 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1de70 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1de80 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1de90 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1dea0 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1deb0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1dec0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1ded0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1dee0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1def0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1df00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1df10 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1df20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1df30 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1df40 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1df50 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1df60 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1df70 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1df80 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1df90 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1dfa0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1dfb0 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1dfc0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1dfd0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1dfe0 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1dff0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1e000 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1e010 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1e020 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1e030 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1e040 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1e050 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1e060 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1e070 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1e080 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1e090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e0a0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1e0b0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1e0c0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1e0d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1e0e0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1e0f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1e100 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1e110 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1e120 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1e130 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1e140 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1e150 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1e160 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e170 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1e180 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1e190 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1e1a0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1e1b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1e1c0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1e1d0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1e1e0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1e1f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1e200 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1e210 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1e220 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1e230 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1e240 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1e250 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1e260 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1e270 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1e280 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1e290 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1e2a0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1e2b0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1e2c0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1e2d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1e2e0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1e2f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1e300 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1e310 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1e320 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e330 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1e340 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1e350 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e360 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1e370 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1e380 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e390 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1e3a0 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1e3b0 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1e3c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1e3d0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1e3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1e3f0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1e400 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1e410 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1e420 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1e430 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1e440 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1e450 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1e460 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1e470 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1e480 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1e490 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1e4a0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1e4b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e4c0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1e4d0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1e4e0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1e4f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e510 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1e520 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1e530 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1e540 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1e550 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1e560 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1e570 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1e580 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1e590 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1e5a0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1e5b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e5c0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1e5d0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1e5e0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1e5f0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1e600 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e610 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e620 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e630 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1e640 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1e650 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1e660 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1e670 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e680 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1e690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1e6a0 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1e6b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e6c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1e6d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e6e0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1e6f0 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1e700 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1e710 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1e720 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1e730 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1e740 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1e750 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1e760 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1e770 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e780 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e790 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1e7a0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1e7b0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1e7c0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e7d0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1e7e0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1e7f0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1e800 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1e810 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1e820 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1e830 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1e840 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1e850 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1e860 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e870 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e880 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1e890 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1e8a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1e8b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e8c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e8d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e8e0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1e8f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1e900 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1e910 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e920 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1e930 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1e940 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1e950 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e960 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1e970 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e980 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1e990 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1e9a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e9b0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1e9c0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1e9d0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1e9e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1e9f0 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1ea00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ea10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1ea20 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1ea30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1ea40 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1ea50 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1ea60 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1ea70 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1ea80 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1ea90 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1eaa0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1eab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1eac0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1ead0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1eae0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1eaf0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1eb00 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1eb10 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1eb20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1eb30 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1eb40 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1eb50 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1eb60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1eb70 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1eb80 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1eb90 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1eba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1ebb0 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1ebc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ebd0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1ebe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ebf0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1ec00 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1ec10 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ec20 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ec30 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1ec40 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1ec50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ec60 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ec70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ec80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1ec90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1eca0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1ecb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ecc0 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1ecd0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1ece0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1ecf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ed00 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1ed10 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1ed20 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1ed30 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1ed40 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1ed50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ed60 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ed70 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1ed80 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1ed90 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1eda0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1edb0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1edc0 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1edd0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1ede0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1edf0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1ee00 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1ee10 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1ee20 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1ee30 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1ee40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1ee50 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1ee60 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1ee70 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1ee80 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1ee90 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1eea0 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1eeb0 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1eec0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1eed0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1eee0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1eef0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1ef00 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1ef10 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1ef20 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1ef30 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1ef40 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1ef50 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1ef60 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1ef70 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1ef80 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1ef90 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1efa0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1efb0 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1efc0 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1efd0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1efe0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1eff0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1f000 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1f010 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1f020 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1f030 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1f040 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1f050 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1f060 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1f070 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1f080 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1f090 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1f0a0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1f0b0 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1f0c0 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1f0d0 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1f0e0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1f0f0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1f100 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f110 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1f120 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1f130 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f140 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f150 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f160 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f170 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1f180 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1f190 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1f1a0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1f1b0 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1f1c0 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1f1d0 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1f1e0 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1f1f0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1f200 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1f210 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1f220 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f230 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1f240 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1f250 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1f260 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1f270 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1f280 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1f290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f2a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f2b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1f2c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f2d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1f2e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f2f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f310 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f320 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1f330 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1f340 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1f350 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1f360 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1f370 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1f380 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1f390 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1f3a0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1f3b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1f3c0 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1f3d0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1f3e0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1f3f0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1f400 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1f410 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1f420 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1f430 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1f440 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1f450 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1f460 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1f470 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1f480 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1f490 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1f4a0 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1f4b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1f4c0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1f4d0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1f4e0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1f4f0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1f500 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1f510 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1f520 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1f530 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1f540 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1f550 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1f560 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1f570 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1f580 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1f590 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1f5a0 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1f5b0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1f5c0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1f5d0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1f5e0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1f5f0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1f600 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1f610 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1f620 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1f630 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1f640 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1f650 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1f660 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1f670 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1f680 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1f690 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1f6a0 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1f6b0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1f6c0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1f6d0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1f6e0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1f6f0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1f700 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1f710 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1f720 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1f730 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1f740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1f750 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1f760 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1f770 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f780 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f790 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1f7a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f7b0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1f7c0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1f7d0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1f7e0 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
1f7f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
1f800 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1f810 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
1f820 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1f830 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1f840 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f850 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1f860 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1f870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f880 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f890 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1f8a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f8b0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1f8c0 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1f8d0 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1f8e0 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
1f8f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f900 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1f910 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1f920 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
1f930 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
1f940 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1f950 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
1f960 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1f970 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
1f980 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1f990 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
1f9a0 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
1f9b0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1f9c0 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
1f9d0 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
1f9e0 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
1f9f0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1fa00 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
1fa10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1fa20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1fa30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1fa40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fa50 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1fa60 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
1fa70 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
1fa80 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
1fa90 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
1faa0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
1fab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fac0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fad0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
1fae0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
1faf0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
1fb00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1fb10 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
1fb20 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
1fb30 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1fb40 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
1fb50 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
1fb60 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
1fb70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1fb80 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1fb90 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
1fba0 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20  ->nCell<1 ){.   
1fbb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fbc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1fbd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fbe0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1fbf0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
1fc00 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
1fc10 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
1fc20 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
1fc30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
1fc40 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
1fc50 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1fc60 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
1fc70 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
1fc80 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
1fc90 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
1fca0 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
1fcb0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
1fcc0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
1fcd0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
1fce0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1fcf0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
1fd00 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
1fd10 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1fd20 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
1fd30 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
1fd40 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
1fd50 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
1fd60 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
1fd70 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
1fd80 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
1fd90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1fda0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1fdb0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1fdc0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1fdd0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
1fde0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
1fdf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1fe00 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1fe10 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
1fe20 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
1fe30 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
1fe40 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1fe50 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
1fe60 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
1fe70 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
1fe80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
1fe90 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
1fea0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
1feb0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
1fec0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
1fed0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
1fee0 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
1fef0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
1ff00 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
1ff10 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
1ff20 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
1ff30 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1ff40 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1ff50 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
1ff60 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  cell index..*/.v
1ff70 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1ff80 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  MoveToParent(BtC
1ff90 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ffa0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ffb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ffc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ffd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ffe0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1fff0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
20000 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
20010 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20020 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
20030 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
20040 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
20050 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
20060 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
20070 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
20080 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
20090 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
200a0 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
200b0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
200c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
200d0 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
200e0 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
200f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
20100 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
20110 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
20120 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20130 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
20140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
20150 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
20160 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
20170 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
20180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20190 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
201a0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
201b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
201c0 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
201d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
201e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
201f0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
20200 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
20210 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
20220 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
20230 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
20240 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
20250 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
20260 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
20270 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
20280 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20290 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
202a0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
202b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
202c0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
202d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
202e0 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
202f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
20300 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
20310 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
20320 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
20330 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
20340 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
20350 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
20360 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20370 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
20380 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
20390 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
203a0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
203b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
203c0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
203d0 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
203e0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
203f0 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
20400 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
20410 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
20420 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
20430 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20440 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
20450 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   0;..    /* If p
20460 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
20470 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
20480 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
20490 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
204a0 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74  or.    ** expect
204b0 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
204c0 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
204d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
204e0 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20  pKeyInfo is.    
204f0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
20500 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
20510 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
20520 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
20530 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75  ase,.    ** retu
20540 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
20550 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  RUPT error.  */.
20560 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
20570 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
20580 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e  Key==1 || pCur->
20590 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
205a0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
205b0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
205c0 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  =0)!=pCur->apPag
205d0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
205e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
205f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
20610 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
20620 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
20630 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
20640 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
20650 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
20660 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
20670 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20680 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
20690 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
206a0 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28  NKey = 0;..  if(
206b0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
206c0 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
206d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
206e0 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
206f0 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
20700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20710 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
20720 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
20730 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
20740 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
20750 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
20760 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
20770 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
20780 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
20790 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
207a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
207b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
207c0 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
207d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
207e0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  pCur->eState = (
207f0 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29  (pRoot->nCell>0)
20800 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
20810 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
20820 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20830 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
20840 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
20850 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
20860 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
20870 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
20880 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
20890 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
208a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
208b0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
208c0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
208d0 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
208e0 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
208f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
20900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
20910 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
20920 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
20930 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
20940 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20950 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20960 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
20970 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20980 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20990 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
209a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
209b0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
209c0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
209d0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
209e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
209f0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
20a00 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20a10 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
20a20 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
20a30 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
20a40 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
20a50 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20a60 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
20a70 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20a80 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
20a90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20aa0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
20ab0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
20ac0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
20ad0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
20ae0 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
20af0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
20b00 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
20b10 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
20b20 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
20b30 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
20b40 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
20b50 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
20b60 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
20b70 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
20b80 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
20b90 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
20ba0 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
20bb0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
20bc0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
20bd0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
20be0 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
20bf0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
20c00 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
20c10 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
20c20 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
20c30 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
20c40 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
20c50 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
20c60 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
20c70 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
20c80 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
20c90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
20ca0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20cb0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
20cc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20cd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20ce0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20cf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20d00 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20d10 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
20d20 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20d30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
20d40 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
20d50 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
20d60 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
20d70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
20d80 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20d90 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
20da0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
20db0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
20dc0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
20dd0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
20de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
20df0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20e00 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
20e10 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
20e20 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20e30 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20e40 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
20e50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20e60 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
20e70 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
20e80 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
20e90 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
20ea0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
20eb0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
20ec0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
20ed0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
20ee0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
20ef0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
20f00 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
20f10 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
20f20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
20f30 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
20f40 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
20f50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
20f60 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20f70 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20f80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20f90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
20fa0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
20fb0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
20fc0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
20fd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20ff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21000 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
21010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21020 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21030 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
21040 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
21050 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  s = 1;.      rc 
21060 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21080 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21090 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
210a0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
210b0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
210c0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
210d0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
210e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
210f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
21100 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
21110 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
21120 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
21130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
21140 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
21150 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
21160 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
21170 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
21180 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
21190 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
211a0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
211b0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
211c0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
211d0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
211e0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
211f0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
21200 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21210 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21220 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21230 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
21240 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
21250 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
21260 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
21270 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
21280 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
21290 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
212a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
212b0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
212c0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
212d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
212e0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
212f0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
21300 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
21310 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
21320 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
21330 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
21340 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
21350 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
21360 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
21370 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
21380 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
21390 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
213a0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
213b0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
213c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
213d0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
213e0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
213f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21400 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
21410 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21420 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21430 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
21440 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
21450 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21460 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
21470 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
21480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21490 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
214a0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
214b0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
214c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
214d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
214e0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
214f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
21500 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21520 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21530 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
21540 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
21550 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
21560 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
21570 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
21580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
21590 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
215a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
215b0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
215c0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
215d0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
215e0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
215f0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
21600 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
21610 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
21620 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
21630 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
21640 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
21650 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
21660 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
21670 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
21680 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
21690 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
216a0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
216b0 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
216c0 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
216d0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
216e0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
216f0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
21700 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
21710 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
21720 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
21730 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
21740 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
21750 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
21760 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
21770 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
21780 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
21790 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
217a0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
217b0 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
217c0 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
217d0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
217e0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
217f0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
21800 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
21810 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
21820 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
21830 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
21840 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
21850 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
21860 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
21870 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
21880 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21890 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
218a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
218b0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
218c0 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
218d0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
218e0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
21910 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
21920 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
21930 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
21940 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
21950 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
21960 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
21970 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
21980 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
21990 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
219a0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
219b0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
219c0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
219d0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
219e0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
219f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21a00 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
21a10 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
21a20 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
21a30 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
21a40 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
21a50 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
21a60 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
21a70 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
21a80 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21a90 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
21aa0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
21ab0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
21ac0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
21ad0 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
21ae0 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
21af0 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
21b00 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
21b10 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
21b20 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
21b30 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
21b40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
21b50 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
21b60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
21b70 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
21b80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21b90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21ba0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21bb0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21bc0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21bd0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
21be0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
21bf0 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
21c00 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
21c10 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
21c20 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
21c30 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
21c40 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
21c50 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
21c60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21c70 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
21c80 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
21c90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21ca0 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
21cb0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
21cc0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
21cd0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
21ce0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21d00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
21d10 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
21d20 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
21d30 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
21d40 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
21d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21d60 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
21d70 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
21d80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21d90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21da0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21db0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21dc0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
21dd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21de0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
21df0 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
21e00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21e10 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
21e20 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
21e30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21e40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21e50 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
21e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e70 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
21e80 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
21e90 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
21ea0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
21eb0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
21ec0 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
21ed0 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
21ee0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
21ef0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21f00 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20  age];.    int c 
21f10 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
21f20 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
21f30 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
21f40 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
21f50 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
21f60 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
21f70 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e   if( (!pPage->in
21f80 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d  tKey && pIdxKey=
21f90 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a  =0) || upr<0 ){.
21fa0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21fb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21fc0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
21fd0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
21fe0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
21ff0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
22000 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22010 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a  ge] = (u16)upr;.
22020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22030 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22040 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22050 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  )((upr+lwr)/2);.
22060 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
22070 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
22080 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
22090 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
220a0 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
220b0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
220c0 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  /.      u8 *pCel
220d0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
220e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
220f0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
22100 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
22110 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  */..      pCur->
22120 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22130 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
22140 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
22150 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
22160 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
22170 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
22180 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
22190 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
221a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
221b0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
221c0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
221d0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
221e0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
221f0 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
22200 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
22210 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
22220 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
22230 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
22240 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
22250 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
22260 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22270 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
22280 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
22290 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
222a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
222b0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
222c0 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
222d0 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
222e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
222f0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22300 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
22310 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
22320 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
22330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
22340 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
22350 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
22360 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73  e is 32768 bytes
22370 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
22380 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
22390 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
223a0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
223b0 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
223c0 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
223d0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20    ** page is at 
223e0 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c  most 8198 bytes,
223f0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74   which may be st
22400 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
22410 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
22420 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
22430 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
22440 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
22450 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
22460 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
22470 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
22480 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
22490 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
224a0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
224b0 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
224c0 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
224d0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
224e0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
224f0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
22500 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
22510 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
22520 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
22530 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
22540 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
22550 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50  80) && nCell<=pP
22560 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
22570 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
22580 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
22590 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
225a0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
225b0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
225c0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
225d0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
225e0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
225f0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
22600 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
22610 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
22620 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
22630 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
22640 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
22650 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
22660 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22670 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
22680 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
22690 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
226a0 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
226b0 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
226c0 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
226d0 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
226e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
226f0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
22700 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
22710 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
22720 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
22730 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
22740 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
22750 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
22760 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
22770 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22780 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
22790 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
227a0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
227b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
227c0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
227d0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
227e0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
227f0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
22800 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
22810 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
22820 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
22830 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
22840 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
22850 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
22860 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
22870 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
22880 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
22890 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
228a0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
228b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
228c0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
228d0 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
228e0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
228f0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
22900 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
22910 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
22920 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
22930 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22940 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
22950 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
22960 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
22970 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
22980 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22990 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
229a0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
229b0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
229c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
229d0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
229e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
229f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22a00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
22a10 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22a30 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
22a40 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
22a50 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
22a60 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
22a70 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
22a80 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22a90 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22aa0 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
22ab0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22ad0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
22ae0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
22af0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22b00 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
22b10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
22b20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
22b30 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
22b40 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
22b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
22b60 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
22b70 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
22b80 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22b90 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
22ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  {.          *pRe
22bb0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
22bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22bd0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22be0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
22bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22c00 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
22c10 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
22c20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
22c30 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
22c40 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  = idx-1;.      }
22c50 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
22c60 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
22c70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
22c80 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22c90 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22ca0 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
22cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22cc0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
22cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22ce0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
22cf0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
22d00 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
22d10 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
22d20 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
22d30 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
22d40 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
22d50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
22d60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
22d70 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
22d80 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22d90 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22da0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
22db0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
22dc0 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
22dd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22de0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22df0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22e00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22e10 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
22e20 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
22e30 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
22e40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
22e50 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22e60 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
22e70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22e80 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
22e90 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
22ea0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
22eb0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22ec0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
22ed0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22ee0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
22ef0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
22f00 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
22f10 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
22f20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
22f30 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22f40 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
22f50 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
22f60 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
22f70 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
22f80 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
22f90 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
22fa0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
22fb0 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
22fc0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
22fd0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
22fe0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
22ff0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
23000 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
23010 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
23020 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
23030 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
23040 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
23050 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
23060 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
23070 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
23080 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
23090 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
230a0 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
230b0 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
230c0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
230d0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
230e0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
230f0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
23100 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
23110 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
23120 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
23130 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
23140 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
23150 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
23160 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
23170 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
23180 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
23190 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
231a0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
231b0 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
231c0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
231d0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
231e0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
231f0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
23200 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
23210 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
23220 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
23230 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
23240 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23250 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
23260 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
23270 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
23280 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
23290 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
232a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
232b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
232c0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
232d0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
232e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
232f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
23300 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
23310 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
23320 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
23330 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
23340 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
23350 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
23360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23370 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
23380 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
23390 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
233a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
233b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
233c0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
233d0 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
233e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
233f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
23400 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
23410 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
23420 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
23430 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
23440 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
23450 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
23460 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23470 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23480 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
23490 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
234a0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
234b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
234c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
234d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
234e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
234f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
23500 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
23510 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
23520 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
23530 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
23540 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
23550 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
23560 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
23570 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
23580 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
23590 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
235a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
235b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
235c0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
235d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
235e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
235f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
23600 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
23610 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
23620 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23630 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
23640 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
23650 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
23660 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
23670 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23680 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
23690 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
236a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
236b0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
236c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
236d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
236e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
236f0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
23700 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
23710 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
23720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23730 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
23740 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
23750 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23760 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
23770 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23780 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
23790 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
237a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
237b0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
237c0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
237d0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
237e0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
237f0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
23800 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
23810 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
23820 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
23830 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
23840 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
23850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23860 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
23870 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23880 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23890 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
238a0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
238b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
238c0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
238d0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
238e0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
238f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23900 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23910 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
23920 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
23930 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
23940 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
23950 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23970 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
23980 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
23990 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
239a0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
239b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
239c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
239d0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
239e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
239f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23a00 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
23a10 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
23a20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
23a30 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
23a40 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
23a50 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
23a60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23a70 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
23a80 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
23a90 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
23aa0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
23ab0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23ac0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
23ad0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
23ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
23af0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23b00 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
23b10 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
23b20 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
23b30 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
23b40 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
23b50 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
23b60 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
23b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23b90 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
23ba0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
23bb0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
23bc0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23bd0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
23be0 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
23bf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23c00 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
23c10 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23c20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
23c30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
23c40 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
23c50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
23c60 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
23c70 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
23c80 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
23c90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23ca0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
23cb0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
23cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23cd0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
23ce0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
23cf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
23d00 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
23d10 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
23d20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
23d30 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
23d40 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
23d50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
23d60 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
23d70 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
23d80 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
23d90 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
23da0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
23db0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
23dc0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
23dd0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
23de0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
23df0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
23e00 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
23e10 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
23e20 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
23e30 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
23e40 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
23e50 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
23e60 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
23e70 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
23e80 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
23e90 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
23ea0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
23eb0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
23ec0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
23ed0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
23ee0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23ef0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
23f00 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
23f10 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
23f20 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
23f30 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
23f40 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
23f50 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
23f60 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
23f70 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
23f80 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
23f90 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
23fa0 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
23fb0 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
23fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
23fd0 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
23fe0 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
23ff0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
24000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
24010 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
24020 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
24030 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
24040 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
24050 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
24060 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
24070 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
24080 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
24090 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
240a0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
240b0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
240c0 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
240d0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
240e0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
240f0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
24100 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
24110 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
24120 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
24130 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
24140 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
24150 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24160 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
24170 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
24180 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
24190 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
241a0 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
241b0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
241c0 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
241d0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
241e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
241f0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
24200 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
24210 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
24220 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
24230 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24240 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
24250 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24260 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
24270 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
24280 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
24290 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67  ;.  mxPage = pag
242a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
242b0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
242c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
242d0 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d 78  36]);.  if( n>mx
242e0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
242f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24300 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
24310 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
24320 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
24330 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
24340 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
24350 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
24360 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
24370 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
24380 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
24390 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
243a0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
243b0 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
243c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
243d0 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
243e0 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
243f0 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
24400 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
24410 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
24420 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
24430 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
24440 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
24450 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
24460 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
24470 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
24480 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
24490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
244a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
244b0 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
244c0 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
244d0 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
244e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
244f0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
24500 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
24510 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
24520 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
24530 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
24540 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
24550 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
24560 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
24570 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
24580 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
24590 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
245a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
245b0 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
245c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
245d0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
245e0 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
245f0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
24600 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
24610 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
24620 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
24630 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
24640 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
24650 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
24660 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24670 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
24680 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
24690 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
246a0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
246b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
246c0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
246d0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
246e0 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
246f0 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
24700 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
24710 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
24720 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
24730 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
24740 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
24750 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
24760 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
24770 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
24780 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
24790 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
247a0 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
247b0 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
247c0 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
247d0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
247e0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
247f0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
24800 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
24810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
24820 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
24830 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
24840 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
24850 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
24860 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
24870 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
24880 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
24890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
248a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
248b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
248c0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
248d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
248e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
248f0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
24900 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24910 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
24920 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
24930 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
24940 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
24950 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
24960 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
24970 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
24980 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
24990 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
249a0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
249b0 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
249c0 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
249d0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
249e0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
249f0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
24a00 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
24a10 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24a20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
24a30 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
24a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24a50 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
24a60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
24a70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24a80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24a90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
24aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24ab0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
24ac0 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
24ad0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
24ae0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
24af0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
24b00 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
24b10 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
24b20 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
24b30 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
24b40 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
24b50 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
24b60 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
24b70 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
24b80 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
24b90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
24ba0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
24bb0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
24bc0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
24bd0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24be0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
24bf0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
24c00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
24c10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24c20 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
24c30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24c40 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
24c50 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
24c60 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
24c70 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
24c80 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
24c90 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
24ca0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
24cb0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
24cc0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
24cd0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
24ce0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
24cf0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
24d00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
24d10 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
24d20 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
24d30 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
24d40 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
24d50 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
24d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24d70 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
24d80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24d90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24da0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24db0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
24dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24dd0 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
24de0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
24df0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
24e00 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
24e10 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24e20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
24e30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
24e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24e50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
24e60 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
24e70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
24e80 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
24e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
24ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24eb0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
24ec0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
24ed0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
24ee0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
24ef0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
24f00 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
24f10 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
24f20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
24f30 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
24f40 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
24f50 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
24f60 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
24f70 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
24f80 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
24f90 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
24fa0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
24fb0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
24fc0 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
24fd0 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
24fe0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24ff0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25000 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
25010 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25020 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
25030 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25040 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
25050 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
25060 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
25070 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
25080 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
250a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
250b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
250c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
250d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
250e0 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
250f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
25100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25120 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25130 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
25140 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25150 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25170 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
25180 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
25190 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
251a0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
251b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
251c0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
251d0 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
251e0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
251f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
25200 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
25210 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
25220 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
25230 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
25240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
25250 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
25260 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25270 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25280 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
25290 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
252a0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
252b0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
252c0 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
252d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
252e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
252f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25300 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
25310 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
25320 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
25330 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25340 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25350 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25370 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
25380 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
25390 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
253a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
253b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
253c0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
253d0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
253e0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
253f0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
25400 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
25410 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
25420 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
25430 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
25440 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
25450 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
25460 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
25470 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
25480 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
25490 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
254a0 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
254b0 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
254c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
254d0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
254e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
254f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25500 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
25510 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
25520 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
25530 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
25540 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
25550 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
25560 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
25570 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
25580 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
25590 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
255a0 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
255b0 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
255c0 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
255d0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
255e0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
255f0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
25600 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
25610 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
25620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
25630 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
25640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25650 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
25660 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
25670 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
25680 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
25690 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
256a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
256b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
256c0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
256d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
256e0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
256f0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
25700 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
25710 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
25720 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
25730 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
25740 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25750 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25760 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25780 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
25790 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
257a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
257b0 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
257c0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
257d0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
257e0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
257f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67       nPage = pag
25800 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
25810 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25820 69 50 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a 20  iPage>nPage ){. 
25830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
25840 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
25850 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
25860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
25870 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25880 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
25890 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
258a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
258b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
258c0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
258d0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
258e0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
258f0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
25900 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
25910 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
25920 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25930 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
25940 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
25950 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
25960 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
25970 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
25980 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
25990 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
259a0 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
259b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
259c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
259d0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
259e0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
259f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
25a00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
25a10 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
25a20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   );.          no
25a30 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
25a40 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
25a50 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20  t, *pPgno);.    
25a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25a70 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
25a80 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
25a90 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
25aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25ac0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25ae0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
25af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
25b00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25b20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25b30 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
25b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25b60 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
25b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b80 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
25b90 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
25ba0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
25bb0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
25bc0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
25bd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25be0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
25bf0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
25c00 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
25c10 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
25c20 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
25c30 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
25c40 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
25c50 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
25c60 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
25c70 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
25c80 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
25c90 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
25ca0 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
25cb0 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
25cc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25cd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25ce0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25cf0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
25d00 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
25d10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25d20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
25d30 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
25d40 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
25d50 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
25d60 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
25d70 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
25d80 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
25d90 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
25da0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
25db0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
25dc0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
25dd0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
25de0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
25df0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
25e00 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
25e10 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
25e20 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
25e30 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
25e40 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
25e50 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
25e60 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
25e70 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
25e80 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
25e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25ea0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
25eb0 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20  , *pPgno, &pPg, 
25ec0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
25ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25ee0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25ef0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
25f00 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
25f10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25f20 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
25f30 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25f40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28  turn rc;.      (
25f50 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
25f60 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
25f70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25f80 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
25f90 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
25fa0 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
25fb0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
25fc0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
25fd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25fe0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
25ff0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
26000 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
26010 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26030 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
26040 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
26050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
26070 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
26080 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
26090 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
260a0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
260b0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
260c0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
260d0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
260e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
260f0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
26100 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
26110 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
26120 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
26130 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
26140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26150 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
26160 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
26170 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
26180 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
26190 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
261a0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
261b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
261c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
261d0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
261e0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
261f0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26200 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
26210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26220 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
26230 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
26240 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
26250 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
26260 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
26270 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
26280 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
26290 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
262a0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
262b0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
262c0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
262d0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
262e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
262f0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
26300 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
26310 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
26320 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
26330 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
26340 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
26350 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
26360 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
26370 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
26380 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
26390 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
263a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
263b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
263c0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
263d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
263e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
263f0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
26400 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
26410 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
26420 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
26430 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
26440 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
26450 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
26460 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
26470 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
26480 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26490 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
264a0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
264b0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
264c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
264d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
264e0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
264f0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
26500 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26510 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
26520 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
26530 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
26540 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
26550 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
26560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26570 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
26580 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
26590 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
265c0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
265d0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
265f0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
26600 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
26610 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
26620 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
26630 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
26640 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26650 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
26660 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
26670 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
26680 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
26690 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
266a0 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
266b0 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
266c0 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
266d0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
266e0 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
266f0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
26700 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
26710 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
26720 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
26730 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
26740 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
26750 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
26760 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
26770 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
26780 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
26790 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
267a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
267b0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
267c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
267d0 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64   nFree+1);..#ifd
267e0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
267f0 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20  _DELETE.  /* If 
26800 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52  the SQLITE_SECUR
26810 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65  E_DELETE compile
26820 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
26830 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
26840 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
26850 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
26860 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
26870 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20  th zeros..  */. 
26880 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
26890 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
268a0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
268b0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
268c0 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20  )).   ||        
268d0 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
268e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
268f0 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29  e->pDbPage)).  )
26900 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
26910 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d  age_out;.  }.  m
26920 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
26930 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
26940 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
26950 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
26960 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
26970 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
26980 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
26990 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
269a0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
269b0 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
269c0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
269d0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
269e0 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  UM ){.    rc = p
269f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
26a00 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
26a10 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
26a20 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
26a30 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
26a40 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
26a50 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
26a60 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
26a70 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
26a80 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
26a90 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
26aa0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
26ab0 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
26ac0 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
26ad0 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
26ae0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
26af0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
26b00 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
26b10 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
26b20 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
26b30 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
26b40 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
26b50 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
26b60 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
26b70 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
26b80 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
26b90 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
26ba0 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
26bb0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
26bc0 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
26bd0 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
26be0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
26bf0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ee!=0 ){.    int
26c00 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
26c10 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
26c20 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
26c30 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
26c40 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
26c50 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26c60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
26c70 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ]);.    rc = sql
26c80 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
26c90 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
26ca0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
26cb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26cc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
26cd0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
26ce0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
26cf0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
26d00 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
26d10 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a   if( nLeaf<0 ){.
26d20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26d30 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
26d40 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
26d50 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
26d60 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74     if( nLeaf<pBt
26d70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
26d80 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
26d90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
26da0 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
26db0 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
26dc0 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
26dd0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
26de0 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
26df0 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
26e00 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
26e10 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
26e20 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
26e30 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
26e40 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
26e50 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
26e60 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
26e70 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
26e80 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
26e90 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
26ea0 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
26eb0 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
26ec0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
26ed0 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
26ee0 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
26ef0 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
26f00 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
26f10 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
26f20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
26f30 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
26f40 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
26f50 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
26f60 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
26f70 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
26f80 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
26f90 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
26fa0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
26fb0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
26fc0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72  ill contain to r
26fd0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
26fe0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
26ff0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
27000 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
27010 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
27020 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
27030 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
27040 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
27050 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
27060 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
27070 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
27080 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
27090 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
270a0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
270b0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
270c0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
270d0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
270e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
270f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
27100 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
27110 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27130 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
27140 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
27150 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
27160 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
27170 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
27180 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  *4], iPage);.#if
27190 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
271a0 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
271b0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
271c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
271d0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
271e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
271f0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
27200 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
27210 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
27220 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
27230 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
27240 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
27250 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
27260 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
27270 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
27280 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
27290 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
272a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
272b0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
272c0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
272d0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
272e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
272f0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
27300 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
27310 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
27320 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
27330 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
27340 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
27350 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
27360 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
27370 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
27380 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
27390 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
273a0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
273b0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
273c0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
273d0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
273e0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
273f0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
27400 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
27410 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28 28  .  */.  if(   ((
27420 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21 3d  !pPage) && (0 !=
27430 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
27440 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
27450 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
27460 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20  )))).     || (0 
27470 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
27480 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
27490 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20 29  ->pDbPage))).  )
274a0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
274b0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
274c0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
274d0 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
274e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
274f0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
27500 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
27510 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
27520 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
27530 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
27540 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
27550 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
27560 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
27570 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
27580 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
27590 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
275a0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
275b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
275c0 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
275d0 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
275e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
275f0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
27600 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
27610 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61 67    return freePag
27620 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
27630 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
27640 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  o);.}../*.** Fre
27650 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
27660 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
27670 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
27680 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
27690 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
276a0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
276b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
276c0 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
276d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
276e0 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
276f0 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
27700 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
27710 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
27720 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
27730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27740 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
27750 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
27760 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
27770 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
27780 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
27790 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
277a0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
277b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
277c0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
277d0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
277e0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
277f0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
27800 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
27810 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
27820 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
27830 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
27840 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
27850 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
27860 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
27870 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
27880 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
27890 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
278a0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
278b0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
278c0 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
278d0 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
278e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
278f0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
27900 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
27910 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
27920 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
27930 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
27940 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
27950 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
27960 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
27970 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
27980 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
27990 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
279a0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
279b0 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
279c0 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
279d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
279e0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
279f0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
27a00 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
27a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27a40 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
27a50 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27a60 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
27a70 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
27a80 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
27a90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27aa0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65    }.    rc = fre
27ab0 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
27ac0 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
27ad0 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
27ae0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
27af0 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
27b00 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
27b10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
27b20 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
27b30 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
27b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
27b60 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
27b70 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
27b80 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
27b90 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
27ba0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
27bb0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
27bc0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
27bd0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
27be0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
27bf0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
27c00 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
27c10 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
27c20 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
27c30 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
27c40 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
27c50 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
27c60 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
27c70 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
27c80 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
27c90 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
27ca0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
27cb0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
27cc0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
27cd0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
27ce0 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
27cf0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
27d00 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
27d10 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
27d20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
27d30 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
27d40 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
27d50 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
27d60 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
27d70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27d80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27d90 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
27da0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
27db0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
27dc0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
27dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
27de0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
27df0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
27e00 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
27e10 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
27e20 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
27e30 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
27e40 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
27e50 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
27e60 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
27e70 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
27e80 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
27e90 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
27ea0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
27ed0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
27ee0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
27ef0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
27f00 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
27f10 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
27f20 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
27f30 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
27f40 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
27f50 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
27f60 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
27f70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27f80 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
27f90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27fa0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
27fb0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
27fc0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
27fd0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27fe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27ff0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
28000 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
28010 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
28020 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
28030 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
28040 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
28050 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
28060 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
28070 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
28080 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
28090 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
280a0 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
280b0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
280c0 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
280d0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
280e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
280f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28100 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28110 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
28120 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
28130 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
28140 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
28150 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28160 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
28170 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
28180 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
28190 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
281a0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
281b0 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
281c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
281d0 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
281e0 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
281f0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
28200 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
28210 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
28220 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
28230 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
28240 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
28250 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
28260 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
28270 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
28280 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
28290 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
282a0 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
282b0 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
282c0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
282d0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
282e0 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
282f0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
28300 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
28310 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
28320 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
28330 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
28340 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
28350 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ( nKey>0x7ffffff
28360 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  f || pKey==0 ){.
28370 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28380 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
28390 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
283a0 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
283b0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
283c0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
283d0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
283e0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
283f0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
28400 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
28410 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
28420 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
28430 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
28440 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
28450 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
28460 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
28470 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
28480 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28490 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
284a0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
284b0 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
284c0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
284d0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
284e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
284f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
28500 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
28510 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
28520 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
28530 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
28540 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
28550 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
28560 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
28570 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28580 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
28590 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
285a0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
285b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
285c0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
285d0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
285e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
285f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
28600 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
28610 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
28620 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
28630 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
28640 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
28650 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
28660 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
28670 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
28680 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
28690 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
286a0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
286b0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
286c0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
286d0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
286e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
286f0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
28700 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
28710 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
28720 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
28730 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
28740 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
28750 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
28760 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
28770 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
28780 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
28790 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
287a0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
287b0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
287c0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
287d0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
287e0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
287f0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
28800 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
28810 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
28820 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
28830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28840 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
28850 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
28860 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
28870 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
28880 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28890 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
288a0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
288b0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
288c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
288d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
288e0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
288f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28900 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28910 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
28920 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
28930 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28940 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
28950 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
28960 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
28970 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
28980 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
28990 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
289a0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
289b0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
289c0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
289d0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
289e0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
289f0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
28a00 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
28a10 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
28a20 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
28a30 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
28a40 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
28a50 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
28a60 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
28a70 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
28a80 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
28a90 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
28aa0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
28ab0 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
28ac0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
28ad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
28ae0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
28af0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28b00 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28b10 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
28b20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
28b30 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
28b40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28b50 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
28b60 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
28b70 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
28b80 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
28b90 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
28ba0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
28bb0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
28bc0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
28bd0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
28be0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28bf0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
28c00 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
28c10 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
28c20 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
28c30 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
28c40 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
28c50 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
28c60 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
28c70 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
28c80 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
28c90 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
28ca0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
28cb0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
28cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
28cd0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
28ce0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28cf0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
28d00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
28d10 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
28d20 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
28d30 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
28d40 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
28d50 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
28d60 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
28d70 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
28d80 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
28d90 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
28da0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
28db0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
28dc0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
28dd0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
28de0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
28df0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
28e00 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
28e10 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
28e20 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
28e30 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
28e40 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
28e50 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
28e60 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
28e70 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
28e80 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
28e90 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
28ea0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
28eb0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
28ec0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
28ed0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
28ee0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
28ef0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
28f00 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
28f10 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
28f20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
28f30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28f40 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
28f50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f60 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
28f70 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
28f80 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
28f90 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
28fa0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
28fb0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
28fc0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
28fd0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
28fe0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
28ff0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
29000 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
29010 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
29020 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
29030 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
29040 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
29050 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
29060 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
29070 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
29080 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
29090 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
290a0 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65  tatic int dropCe
290b0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
290c0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
290d0 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
290e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
290f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
29100 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
29110 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
29120 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
29130 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
29140 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29150 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
29160 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
29170 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
29180 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
29190 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
291a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
291b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
291c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
291d0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
291e0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
291f0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
29200 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
29210 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
29220 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
29230 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
29240 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
29250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29260 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29270 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29280 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
29290 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
292a0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
292b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
292c0 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
292d0 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20  yte(ptr);.  if( 
292e0 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66  (pc<pPage->hdrOf
292f0 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
29300 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c  eaf?0:4)).     |
29310 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e  | (pc+sz>pPage->
29320 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
29330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29340 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29350 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  PT;.  }.  rc = f
29360 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
29370 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
29380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
293a0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
293b0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
293c0 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
293d0 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
293e0 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
293f0 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
29400 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
29410 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
29420 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29430 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
29440 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
29450 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75  ree += 2;.  retu
29460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29470 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
29480 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
29490 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
294a0 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
294b0 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
294c0 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
294d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
294e0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
294f0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
29500 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
29510 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
29520 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
29530 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
29540 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
29550 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
29560 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
29570 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
29580 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
29590 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
295a0 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
295b0 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
295c0 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
295d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
295e0 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
295f0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
29600 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
29610 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
29620 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
29630 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
29640 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
29650 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
29660 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29670 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
29680 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
29690 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
296a0 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
296b0 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
296c0 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
296d0 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
296e0 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
296f0 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
29700 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
29710 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
29720 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
29730 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
29740 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
29750 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
29760 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
29770 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
29780 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
29790 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
297a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
297b0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
297c0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
297d0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
297e0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
297f0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
29800 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
29810 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
29820 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
29830 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
29840 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
29850 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
29860 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
29870 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
29880 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
29890 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
298a0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
298b0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
298c0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
298d0 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66  hild       /* If
298e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
298f0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
29900 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
29910 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
29920 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
29930 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
29940 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
29950 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
29960 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
29970 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
29980 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
29990 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
299a0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
299b0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
299c0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
299d0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
299e0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
299f0 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
29a00 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
29a10 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
29a20 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
29a30 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
29a40 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
29a50 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
29a60 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
29a70 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
29a80 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
29a90 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
29aa0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
29ab0 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
29ac0 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
29ad0 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74  data[] */..  int
29ae0 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
29af0 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73   ? 4 : 0);..  as
29b00 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
29b10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
29b20 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
29b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29b40 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
29b50 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
29b60 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
29b70 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
29b80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29b90 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
29ba0 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
29bb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29bc0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
29bd0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
29be0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29bf0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29c00 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29c10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
29c20 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
29c30 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
29c40 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
29c50 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
29c60 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
29c70 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
29c80 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
29c90 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
29ca0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29cb0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29cc0 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
29cd0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
29ce0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
29cf0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
29d00 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
29d10 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
29d20 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
29d30 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
29d40 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
29d50 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
29d60 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
29d70 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
29d80 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
29d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29da0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29db0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29dc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29dd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29de0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29df0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29e00 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
29e10 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29e20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29e30 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
29e40 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
29e50 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
29e60 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
29e70 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
29e80 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
29e90 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
29ea0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
29eb0 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
29ec0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
29ed0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29ee0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65    assert( idx>=e
29ef0 6e 64 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20  nd+2 );.    if( 
29f00 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
29f10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29f20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29f30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29f40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
29f50 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
29f60 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
29f70 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
29f80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
29f90 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
29fa0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
29fb0 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69  Skip);.    if( i
29fc0 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
29fd0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
29fe0 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
29ff0 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64   }.    for(j=end
2a000 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
2a010 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
2a020 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
2a030 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
2a040 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2a050 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
2a060 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2a070 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2a080 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2a090 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2a0a0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2a0b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2a0c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a0d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2a0e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a0f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2a100 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2a110 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2a120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2a130 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2a140 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2a150 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2a160 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2a170 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2a180 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
2a190 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
2a1a0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2a1b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2a1c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a1d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a1e0 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
2a1f0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
2a200 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
2a210 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
2a220 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
2a230 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
2a240 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
2a250 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2a260 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
2a270 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2a280 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
2a290 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
2a2a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
2a2b0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
2a2c0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2a2d0 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
2a2e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2a2f0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
2a300 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
2a310 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
2a320 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
2a330 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
2a340 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
2a350 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2a360 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a370 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
2a380 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2a390 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
2a3a0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
2a3b0 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
2a3c0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2a3d0 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
2a3e0 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
2a3f0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a410 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
2a420 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2a430 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
2a440 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
2a450 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a460 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
2a470 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2a480 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50  int nUsable = pP
2a490 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2a4a0 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
2a4b0 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a  size of page */.
2a4c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a4d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2a4e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a4f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a500 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a510 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
2a520 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
2a530 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2a540 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2a550 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2a560 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2a570 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a580 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2a590 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2a5a0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2a5b0 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2a5c0 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2a5d0 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2a5e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2a5f0 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2a600 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
2a610 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
2a620 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
2a630 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2a640 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
2a650 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2a660 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2a670 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2a680 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43  =0; i--){.    pC
2a690 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2a6a0 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69   cellbody -= aSi
2a6b0 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ze[i];.    put2b
2a6c0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2a6d0 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2a6e0 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2a6f0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2a700 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aSize[i]);.  }. 
2a710 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a720 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2a730 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a740 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2a750 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2a760 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2a770 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2a780 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2a790 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2a7a0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2a7b0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2a7c0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2a7d0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2a7e0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2a7f0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2a800 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2a810 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2a820 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2a830 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2a840 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2a850 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2a860 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2a870 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2a880 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2a890 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2a8a0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2a8b0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2a8c0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2a8d0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2a8e0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2a8f0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2a900 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2a910 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2a920 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2a930 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2a940 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2a950 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2a960 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2a970 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2a980 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2a990 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2a9a0 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2a9b0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2a9c0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2a9d0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2a9e0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2a9f0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2aa00 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2aa10 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2aa20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2aa30 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2aa40 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2aa50 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2aa60 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2aa70 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2aa80 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2aa90 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2aaa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2aab0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2aac0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2aad0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2aae0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2aaf0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2ab00 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2ab10 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2ab20 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2ab30 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2ab40 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2ab50 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2ab60 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2ab70 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2ab80 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2ab90 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2aba0 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2abb0 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
2abc0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2abd0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2abe0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2abf0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2ac00 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2ac10 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2ac20 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2ac30 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2ac40 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2ac50 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2ac60 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2ac70 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2ac80 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2ac90 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2aca0 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2acb0 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2acc0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2acd0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2ace0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2acf0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2ad00 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2ad10 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2ad20 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2ad30 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2ad40 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2ad50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2ad60 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2ad70 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2ad80 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2ad90 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2ada0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2adb0 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2adc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2add0 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2ade0 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2adf0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2ae00 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2ae10 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2ae20 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2ae30 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2ae40 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2ae50 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2ae60 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2ae70 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2ae80 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2ae90 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2aea0 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2aeb0 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2aec0 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2aed0 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2aee0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2aef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2af00 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2af10 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2af20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2af30 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2af40 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2af50 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2af60 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2af70 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2af80 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2afa0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2afb0 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2afc0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2aff0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2b000 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2b010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2b020 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2b030 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2b040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b050 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b060 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2b070 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2b080 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2b090 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2b0a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b0b0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2b0c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
2b0d0 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  ell<=0 ) return 
2b0e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b0f0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
2b100 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
2b110 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
2b120 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
2b130 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
2b140 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
2b150 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
2b160 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
2b170 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2b180 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
2b190 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
2b1a0 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
2b1b0 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
2b1c0 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
2b1d0 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2b1e0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2b1f0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
2b200 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
2b210 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
2b220 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
2b230 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
2b240 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
2b250 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2b260 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2b270 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b280 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2b290 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2b2a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b2b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b2c0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2b2d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b2e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2b2f0 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2b300 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2b310 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2b320 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2b330 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2b340 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2b350 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2b360 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2b370 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2b380 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2b390 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2b3a0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2b3b0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2b3c0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2b3d0 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2b3e0 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2b3f0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2b400 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2b410 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2b420 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2b430 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2b440 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2b450 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2b460 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2b470 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2b480 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2b490 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2b4a0 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2b4b0 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2b4c0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2b4d0 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2b4e0 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2b4f0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2b500 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2b510 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2b520 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2b530 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2b540 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2b550 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2b560 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2b570 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2b580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b590 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b5a0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2b5b0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2b5c0 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2b5d0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2b5e0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2b5f0 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2b600 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b610 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b620 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
2b630 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b  tr(pNew, pCell);
2b640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b650 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2b660 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2b670 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2b680 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2b690 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2b6a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2b6b0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2b6c0 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2b6d0 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2b6e0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2b6f0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2b700 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2b710 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2b720 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2b730 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2b740 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2b750 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2b760 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2b770 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2b780 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2b790 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2b7a0 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2b7b0 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2b7c0 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2b7d0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2b7e0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2b7f0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2b800 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2b810 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2b820 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2b830 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2b840 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2b850 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2b860 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2b870 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2b880 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2b890 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2b8a0 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2b8b0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2b8c0 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2b8d0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2b8e0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2b8f0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2b900 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2b910 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2b920 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2b930 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2b940 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2b950 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2b960 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2b970 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2b980 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2b990 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2b9a0 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2b9b0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2b9c0 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2b9d0 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2b9e0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2b9f0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2ba00 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2ba10 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2ba20 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2ba30 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2ba40 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ent,pParent->nCe
2ba50 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28  ll,pSpace,(int)(
2ba60 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70  pOut-pSpace),0,p
2ba70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  Page->pgno);..  
2ba80 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2ba90 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2baa0 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2bab0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2bac0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2bad0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2bae0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2baf0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2bb00 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2bb10 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2bb20 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2bb30 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2bb40 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2bb50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2bb60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2bb70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2bb80 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2bb90 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2bba0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2bbb0 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2bbc0 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2bbd0 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2bbe0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2bbf0 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2bc00 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2bc10 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2bc20 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2bc30 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2bc40 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2bc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2bc60 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2bc70 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2bc80 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2bc90 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2bca0 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2bcb0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2bcc0 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2bcd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2bce0 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2bcf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2bd00 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2bd10 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2bd20 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2bd30 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2bd40 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2bd50 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2bd60 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2bd70 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2bd80 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2bd90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2bda0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2bdb0 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
2bdc0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
2bdd0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2bde0 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
2bdf0 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
2be00 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2be10 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2be20 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
2be30 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2be40 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2be50 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2be60 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
2be70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2be80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2be90 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
2bea0 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
2beb0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2bec0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2bed0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2bee0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2bef0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2bf00 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2bf10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2bf20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2bf30 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
2bf40 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
2bf50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2bf60 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2bf70 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
2bf80 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2bf90 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
2bfa0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2bfb0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2bfc0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
2bfd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2bfe0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2bff0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c000 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
2c010 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2c020 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
2c030 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
2c040 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2c050 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
2c060 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
2c070 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
2c080 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2c090 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
2c0a0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
2c0b0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2c0c0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
2c0d0 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
2c0e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
2c0f0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
2c100 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
2c110 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
2c120 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2c130 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
2c140 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
2c150 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
2c160 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
2c170 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2c180 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2c190 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
2c1a0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
2c1b0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
2c1c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
2c1d0 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
2c1e0 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f  he.** MemPage.aO
2c1f0 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
2c200 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
2c210 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
2c220 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
2c230 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
2c240 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
2c250 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ng sqlite3BtreeI
2c260 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2c270 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2c280 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c290 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2c2a0 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2c2b0 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2c2c0 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2c2d0 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2c2e0 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2c2f0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2c300 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2c310 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2c320 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2c330 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2c340 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  t copyNodeConten
2c350 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2c360 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b  , MemPage *pTo){
2c370 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f  .  BtShared * co
2c380 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d  nst pBt = pFrom-
2c390 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  >pBt;.  u8 * con
2c3a0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2c3b0 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
2c3c0 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2c3d0 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f  >aData;.  int co
2c3e0 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2c3f0 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2c400 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f  .  int const iTo
2c410 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2c420 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2c430 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c440 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44  ITE_OK;.  int iD
2c450 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
2c460 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
2c470 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
2c480 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2c490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2c4a0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2c4b0 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2c4c0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20  usableSize );.. 
2c4d0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74   /* Copy the b-t
2c4e0 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74  ree node content
2c4f0 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d   from page pFrom
2c500 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f   to page pTo. */
2c510 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62  .  iData = get2b
2c520 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2c530 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  Hdr+5]);.  memcp
2c540 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2c550 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2c560 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2c570 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ata);.  memcpy(&
2c580 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2c590 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2c5a0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2c5b0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2c5c0 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74  l);..  /* Reinit
2c5d0 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20  ialize page pTo 
2c5e0 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  so that the cont
2c5f0 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ents of the MemP
2c600 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  age structure.  
2c610 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2c620 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2c630 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2c640 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20   "cannot" fail, 
2c650 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  as the.  ** data
2c660 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72   copied from pFr
2c670 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  om is known to b
2c680 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70  e valid.  */.  p
2c690 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
2c6a0 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20    TESTONLY(rc = 
2c6b0 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  ) sqlite3BtreeIn
2c6c0 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61  itPage(pTo);.  a
2c6d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2c6e0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  E_OK );..  /* If
2c6f0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2c700 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2c710 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2c720 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2c730 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d  .  ** for any b-
2c740 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2c750 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2c760 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2c770 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f   pointers to. */
2c780 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2c790 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
2c7a0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2c7b0 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
2c7c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c7d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2c7e0 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2c7f0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2c800 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2c810 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2c820 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2c830 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2c840 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2c850 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2c860 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2c870 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2c880 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2c890 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2c8a0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2c8b0 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2c8c0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2c8d0 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2c8e0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2c8f0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2c900 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2c910 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2c920 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2c930 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2c940 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2c950 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2c960 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2c970 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2c980 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2c990 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2c9a0 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2c9b0 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2c9c0 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2c9d0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2c9e0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2c9f0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2ca00 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2ca10 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2ca20 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2ca30 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2ca40 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2ca50 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2ca60 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2ca70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2ca80 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2ca90 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2caa0 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2cab0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2cac0 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2cad0 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2cae0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2caf0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2cb00 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2cb10 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2cb20 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2cb30 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2cb40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2cb50 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2cb60 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2cb70 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2cb80 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2cb90 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2cba0 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2cbb0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2cbc0 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2cbd0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2cbe0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2cbf0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2cc00 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2cc10 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2cc20 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2cc30 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2cc40 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2cc50 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2cc60 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2cc70 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2cc80 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2cc90 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2cca0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2ccb0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2ccc0 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2ccd0 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2cce0 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2ccf0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2cd00 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2cd10 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2cd20 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2cd30 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2cd40 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2cd50 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2cd60 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2cd70 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2cd80 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2cd90 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2cda0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2cdb0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2cdc0 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2cdd0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2cde0 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2cdf0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2ce00 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2ce10 72 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  r page-size byte
2ce20 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69  s in size. If, i
2ce30 6e 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  n inserting cell
2ce40 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2ce50 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
2ce60 6e 74 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20  nt), the parent 
2ce70 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2ce80 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2ce90 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2cea0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2ceb0 74 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ts overflow cell
2cec0 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
2ced0 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
2cee0 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
2cef0 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
2cf00 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2cf10 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
2cf20 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
2cf30 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
2cf40 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
2cf50 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
2cf60 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
2cf70 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
2cf80 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
2cf90 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
2cfa0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2cfb0 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
2cfc0 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
2cfd0 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
2cfe0 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
2cff0 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
2d000 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2d010 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2d020 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2d030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d040 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2d050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2d060 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
2d070 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2d080 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
2d090 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2d0a0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
2d0b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d0c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
2d0d0 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
2d0e0 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
2d0f0 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
2d100 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
2d110 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
2d120 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
2d130 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
2d140 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
2d150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d160 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
2d170 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
2d180 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2d190 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d1a0 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
2d1b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
2d1c0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
2d1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d1e0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
2d1f0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
2d200 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
2d210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2d220 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
2d230 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
2d240 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
2d250 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
2d260 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d270 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2d280 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
2d290 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2d2a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d2b0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2d2c0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
2d2d0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
2d2e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2d2f0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2d300 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
2d310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2d320 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
2d330 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2d340 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
2d350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2d370 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
2d380 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
2d390 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
2d3a0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2d3b0 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
2d3c0 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3e0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
2d3f0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
2d400 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
2d410 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
2d420 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2d430 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
2d440 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
2d450 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
2d460 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
2d470 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2d480 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
2d490 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
2d4a0 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2d4b0 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
2d4c0 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
2d4d0 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
2d4e0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
2d4f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d500 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2d510 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
2d520 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
2d530 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
2d540 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2d550 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
2d560 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
2d570 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
2d580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d590 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
2d5a0 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
2d5b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
2d5c0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
2d5d0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2d5e0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
2d5f0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2d600 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
2d610 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
2d620 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
2d630 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
2d640 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
2d650 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2d660 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
2d670 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
2d680 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
2d690 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
2d6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2d6b0 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
2d6c0 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
2d6d0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
2d6e0 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
2d6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2d700 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2d710 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2d720 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2d730 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d740 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2d750 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2d760 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2d770 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2d780 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2d790 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2d7a0 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2d7b0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2d7c0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2d7d0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2d7e0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2d7f0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2d800 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d810 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2d820 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2d830 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2d840 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2d850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2d860 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
2d870 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
2d880 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2d890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d8a0 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
2d8b0 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
2d8c0 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
2d8d0 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
2d8e0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2d8f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d900 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d910 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d920 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d930 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2d940 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
2d950 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d960 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2d970 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2d980 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2d990 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
2d9a0 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
2d9b0 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
2d9c0 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
2d9d0 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
2d9e0 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
2d9f0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
2da00 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
2da10 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
2da20 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
2da30 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
2da40 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
2da50 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
2da60 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
2da70 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
2da80 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
2da90 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2daa0 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2dab0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2dac0 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
2dad0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
2dae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2daf0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2db00 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
2db10 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61  Ovfl[0].idx==iPa
2db20 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
2db30 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
2db40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2db50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2db60 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
2db70 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
2db80 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
2db90 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
2dba0 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
2dbb0 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
2dbc0 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
2dbd0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
2dbe0 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
2dbf0 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
2dc00 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
2dc10 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
2dc20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
2dc30 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
2dc40 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
2dc50 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
2dc60 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
2dc70 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
2dc80 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2dc90 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2dca0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2dcb0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2dcc0 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
2dcd0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2dce0 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
2dcf0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2dd00 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2dd10 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
2dd20 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
2dd30 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
2dd40 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
2dd50 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
2dd60 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
2dd70 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
2dd80 6e 74 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f  nt page, as if o
2dd90 6e 65 20 65 78 69 73 74 65 64 20 69 74 20 68 61  ne existed it ha
2dda0 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  s already.  ** b
2ddb0 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f  een removed.  */
2ddc0 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
2ddd0 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
2dde0 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
2ddf0 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
2de00 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64  iv = 0;.    nOld
2de10 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b   = i+1;.  }else{
2de20 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20  .    nOld = 3;. 
2de30 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
2de40 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
2de50 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
2de60 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
2de70 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
2de80 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
2de90 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20  xDiv = i-2;.    
2dea0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44  }else{.      nxD
2deb0 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
2dec0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
2ded0 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69   2;.  }.  if( (i
2dee0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2def0 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
2df00 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2df10 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
2df20 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2df30 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2df40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2df50 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
2df60 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2df70 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2df80 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
2df90 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
2dfa0 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
2dfb0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
2dfc0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2dfd0 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
2dfe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dff0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
2e000 4f 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66  Old, 0, i*sizeof
2e010 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
2e020 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2e030 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
2e040 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
2e050 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
2e060 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
2e070 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
2e080 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
2e090 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e  ..    if( pParen
2e0a0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20  t->nOverflow && 
2e0b0 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
2e0c0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29  ->aOvfl[0].idx )
2e0d0 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2e0e0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66   = pParent->aOvf
2e0f0 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2e100 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2e110 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2e120 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
2e130 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2e140 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2e150 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
2e160 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
2e170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
2e180 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
2e190 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2e1a0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2e1b0 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
2e1c0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2e1d0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2e1e0 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2e1f0 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2e200 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
2e210 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
2e220 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2e230 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
2e240 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
2e250 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
2e260 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
2e270 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
2e280 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
2e290 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
2e2a0 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
2e2b0 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
2e2c0 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
2e2d0 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
2e2e0 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2e2f0 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
2e300 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2e310 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
2e320 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
2e330 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
2e340 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
2e350 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
2e360 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
2e370 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
2e380 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e390 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69   Unless SQLite i
2e3a0 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65  s compiled in se
2e3b0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2e3c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2e3d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
2e3e0 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
2e3f0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2e400 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
2e410 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
2e420 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2e430 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
2e440 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
2e450 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
2e460 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
2e470 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
2e480 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
2e490 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
2e4a0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
2e4b0 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
2e4c0 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66  ated.  */.#ifdef
2e4d0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
2e4e0 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63  ELETE.      memc
2e4f0 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61  py(&aOvflSpace[a
2e500 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2e510 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69  >aData], apDiv[i
2e520 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
2e530 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
2e540 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
2e550 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
2e560 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ta];.#endif.    
2e570 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2e580 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2e590 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
2e5a0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  szNew[i]);.    }
2e5b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
2e5c0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
2e5d0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
2e5e0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
2e5f0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
2e600 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
2e610 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
2e620 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
2e630 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
2e640 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
2e650 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
2e660 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
2e670 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
2e680 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2e690 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
2e6a0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
2e6b0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
2e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6d0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
2e6e0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
2e6f0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e710 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
2e720 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e750 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
2e760 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
2e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e790 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
2e7a0 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
2e7b0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
2e7c0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
2e7d0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
2e7e0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
2e7f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e800 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
2e810 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2e820 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
2e830 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
2e840 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
2e850 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
2e860 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
2e870 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2e880 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
2e890 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
2e8a0 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
2e8b0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
2e8c0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
2e8d0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
2e8e0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
2e8f0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
2e900 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
2e910 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
2e920 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2e930 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
2e940 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
2e950 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
2e960 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
2e970 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
2e980 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
2e990 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
2e9a0 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
2e9b0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
2e9c0 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
2e9d0 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
2e9e0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
2e9f0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
2ea00 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
2ea10 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
2ea20 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
2ea30 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
2ea40 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2ea50 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
2ea60 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
2ea70 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
2ea80 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
2ea90 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
2eaa0 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
2eab0 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
2eac0 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
2ead0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
2eae0 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
2eaf0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
2eb00 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
2eb10 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
2eb20 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2eb30 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
2eb40 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
2eb50 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
2eb60 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
2eb70 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
2eb80 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
2eb90 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72  ..  */.  leafCor
2eba0 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b  rection = apOld[
2ebb0 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  0]->leaf*4;.  le
2ebc0 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30  afData = apOld[0
2ebd0 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  ]->hasData;.  fo
2ebe0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2ebf0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  ++){.    int lim
2ec00 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  it;.    .    /* 
2ec10 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
2ec20 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65  thing else, take
2ec30 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
2ec40 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62  'th original sib
2ec50 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20  ling.    ** The 
2ec60 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
2ec70 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
2ec80 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
2ec90 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a  ies rather.    *
2eca0 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
2ecb0 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
2ecc0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2ecd0 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
2ece0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
2ecf0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
2ed00 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d  itten.  */.    M
2ed10 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
2ed20 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
2ed30 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42  age*)&aSpace1[pB
2ed40 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a  t->pageSize + k*
2ed50 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
2ed60 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  Old, apOld[i], s
2ed70 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
2ed80 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61  .    pOld->aData
2ed90 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b   = (void*)&pOld[
2eda0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2edb0 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  Old->aData, apOl
2edc0 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
2edd0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
2ede0 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e    limit = pOld->
2edf0 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
2ee00 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
2ee10 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
2ee20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ee30 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
2ee40 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
2ee50 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
2ee60 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
2ee70 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
2ee80 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
2ee90 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
2eea0 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
2eeb0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2eec0 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
2eed0 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29  -1 && !leafData)
2eee0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
2eef0 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a   (u16)szNew[i];.
2ef00 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
2ef10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2ef20 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2ef30 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2ef40 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
2ef50 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
2ef60 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
2ef70 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
2ef80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ef90 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2efa0 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
2efb0 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
2efc0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
2efd0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2efe0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
2eff0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2f000 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
2f010 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2f020 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2f030 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
2f040 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2f050 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
2f060 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
2f070 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
2f080 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2f090 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
2f0a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
2f0b0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2f0c0 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
2f0d0 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
2f0e0 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
2f0f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2f100 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
2f110 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
2f120 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
2f130 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
2f140 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
2f150 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
2f160 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
2f170 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
2f180 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
2f190 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f1a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2f1b0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2f1c0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2f1d0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
2f1e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2f1f0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
2f200 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
2f210 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
2f220 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2f230 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
2f240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f250 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2f260 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
2f270 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
2f280 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
2f290 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
2f2a0 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
2f2b0 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
2f2c0 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
2f2d0 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
2f2e0 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
2f2f0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
2f300 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
2f310 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
2f320 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
2f330 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
2f340 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
2f350 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
2f360 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
2f370 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
2f380 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
2f390 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
2f3a0 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
2f3b0 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
2f3c0 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
2f3d0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
2f3e0 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
2f3f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
2f400 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
2f410 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
2f420 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
2f430 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
2f440 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
2f450 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
2f460 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
2f470 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
2f480 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
2f490 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
2f4a0 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
2f4b0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2f4c0 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
2f4d0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2f4e0 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
2f4f0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
2f500 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
2f510 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
2f520 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2f530 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
2f540 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
2f550 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
2f560 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
2f570 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
2f580 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
2f590 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
2f5a0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
2f5b0 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
2f5c0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
2f5d0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
2f5e0 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
2f5f0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
2f600 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
2f610 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
2f620 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
2f630 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
2f640 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
2f650 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
2f660 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c  ORRUPT; goto bal
2f670 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
2f680 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
2f690 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
2f6a0 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
2f6b0 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
2f6c0 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
2f6d0 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
2f6e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
2f6f0 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
2f700 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
2f710 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
2f720 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
2f730 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
2f740 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
2f750 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
2f760 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
2f770 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
2f780 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
2f790 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
2f7a0 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
2f7b0 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
2f7c0 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
2f7d0 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
2f7e0 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
2f7f0 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
2f800 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
2f810 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2f820 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
2f830 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
2f840 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
2f850 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
2f860 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
2f870 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
2f880 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
2f890 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
2f8a0 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
2f8b0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
2f8c0 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
2f8d0 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
2f8e0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
2f8f0 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
2f900 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
2f910 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2f920 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
2f930 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
2f940 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
2f950 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2f960 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
2f970 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
2f980 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
2f990 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
2f9a0 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
2f9b0 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
2f9c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f9d0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
2f9e0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
2f9f0 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
2fa00 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2fa10 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
2fa20 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
2fa30 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
2fa40 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2fa50 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
2fa60 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
2fa70 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
2fa80 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
2fa90 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
2faa0 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
2fab0 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
2fac0 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
2fad0 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
2fae0 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
2faf0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
2fb00 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
2fb10 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2fb20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
2fb30 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
2fb40 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
2fb50 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
2fb60 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
2fb70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
2fb80 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
2fb90 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
2fba0 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
2fbb0 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
2fbc0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2fbd0 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
2fbe0 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
2fbf0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
2fc00 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
2fc10 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
2fc20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
2fc30 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
2fc40 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
2fc50 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
2fc60 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
2fc70 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
2fc80 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
2fc90 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
2fca0 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c   %d  ",.    apOl
2fcb0 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20  d[0]->pgno, .   
2fcc0 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64   nOld>=2 ? apOld
2fcd0 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20  [1]->pgno : 0,. 
2fce0 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f     nOld>=3 ? apO
2fcf0 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a  ld[2]->pgno : 0.
2fd00 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a    ));..  /*.  **
2fd10 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
2fd20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
2fd30 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
2fd40 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
2fd50 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e  f( apOld[0]->pgn
2fd60 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  o<=1 ){.    rc =
2fd70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2fd80 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2fd90 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2fda0 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f   pageFlags = apO
2fdb0 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b  ld[0]->aData[0];
2fdc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
2fdd0 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
2fde0 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
2fdf0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2fe00 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
2fe10 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
2fe20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2fe30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2fe40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fe50 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
2fe60 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2fe70 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2fe80 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fe90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fea0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
2feb0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
2fec0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2fed0 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2fee0 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  , pgno, 0);.    
2fef0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2ff00 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2ff10 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2ff20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
2ff30 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew++;..      /* 
2ff40 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2ff50 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2ff60 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2ff70 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ge. */.      if(
2ff80 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2ff90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2ffa0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
2ffb0 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
2ffc0 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2ffd0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
2ffe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
30000 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
30010 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
30020 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
30030 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
30040 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
30050 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
30060 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
30070 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
30080 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
30090 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
300a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
300b0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
300c0 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
300d0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
300e0 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
300f0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
30100 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
30110 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
30120 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
30130 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
30140 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
30150 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
30160 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
30170 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
30180 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
30190 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
301a0 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
301b0 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
301c0 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
301d0 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
301e0 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
301f0 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
30200 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
30210 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
30220 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
30230 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
30240 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
30250 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
30260 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
30270 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
30280 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
30290 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
302a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
302b0 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
302c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
302d0 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
302e0 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
302f0 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
30300 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
30310 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
30320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
30330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
30340 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d  minV = apNew[i]-
30350 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d  >pgno;.    int m
30360 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
30370 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
30380 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  ){.      if( apN
30390 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73  ew[j]->pgno<(uns
303a0 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
303b0 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
303c0 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61          minV = a
303d0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[j]->pgno;. 
303e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
303f0 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
30400 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
30410 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
30420 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69       t = apNew[i
30430 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70  ]->pgno;.      p
30440 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
30450 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
30460 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
30470 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
30480 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
30490 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28  TRACE(("new: %d(
304a0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
304b0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
304c0 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d  n",.    apNew[0]
304d0 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d  ->pgno, szNew[0]
304e0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
304f0 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apNew[1]->pgno :
30500 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
30510 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
30520 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b  nNew>=3 ? apNew[
30530 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  2]->pgno : 0, nN
30540 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
30550 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
30560 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67  4 ? apNew[3]->pg
30570 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  no : 0, nNew>=4 
30580 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
30590 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70      nNew>=5 ? ap
305a0 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[4]->pgno : 0
305b0 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
305c0 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61  w[4] : 0));..  a
305d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
305e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
305f0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
30600 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70   );.  put4byte(p
30610 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65  Right, apNew[nNe
30620 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  w-1]->pgno);..  
30630 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
30640 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
30650 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
30660 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
30670 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
30680 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
30690 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
306a0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
306b0 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
306c0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
306d0 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
306e0 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
306f0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
30700 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
30710 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
30720 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
30730 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
30740 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
30750 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
30760 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
30770 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
30780 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
30790 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
307a0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
307b0 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
307c0 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
307d0 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
307e0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
307f0 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
30800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
30810 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
30820 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
30830 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
30840 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
30850 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
30860 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
30870 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
30880 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
30890 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d   i<nNew-1 || j==
308a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
308b0 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
308c0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
308d0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
308e0 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
308f0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
30900 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
30910 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
30920 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
30930 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
30940 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
30950 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70  pTemp = &aOvflSp
30960 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b  ace[iOvflSpace];
30970 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
30980 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
30990 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
309a0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
309b0 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
309c0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
309d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
309e0 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
309f0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
30a00 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
30a10 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
30a20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
30a30 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
30a40 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
30a50 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
30a60 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
30a70 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
30a80 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
30a90 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
30aa0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
30ab0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
30ac0 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
30ad0 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
30ae0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30af0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
30b00 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
30b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30b20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
30b30 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
30b40 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
30b50 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
30b60 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
30b70 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
30b80 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
30b90 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
30ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
30bb0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
30bc0 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
30bd0 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
30be0 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
30bf0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
30c00 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
30c10 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
30c20 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
30c30 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
30c40 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
30c50 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
30c60 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
30c70 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
30c80 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
30c90 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
30ca0 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74  * (see sqlite3Bt
30cb0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
30cc0 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
30cd0 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
30ce0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
30cf0 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
30d00 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
30d10 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
30d20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
30d30 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
30d40 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
30d50 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
30d60 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30d70 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
30d80 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
30d90 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
30da0 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
30db0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
30dc0 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
30dd0 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
30de0 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
30df0 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
30e00 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
30e10 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
30e20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
30e30 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
30e40 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
30e50 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
30e60 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
30e70 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
30e80 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
30e90 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
30ea0 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
30eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30ec0 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
30ed0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
30ee0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
30ef0 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
30f00 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
30f10 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
30f20 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
30f30 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
30f40 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
30f50 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
30f60 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
30f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30f80 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
30f90 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30fa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30fb0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30fc0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
30fd0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b  ge) );..      j+
30fe0 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
30ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
31000 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
31010 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
31020 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
31030 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
31040 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
31050 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
31060 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
31070 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
31080 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
31090 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
310a0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
310b0 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20  hild, 4);.  }.. 
310c0 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70   if( isRoot && p
310d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
310e0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72   && pParent->hdr
310f0 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d  Offset<=apNew[0]
31100 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f  ->nFree ){.    /
31110 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
31120 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
31130 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  w contains no ce
31140 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69  lls. The only si
31150 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67  bling.    ** pag
31160 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  e is the right-c
31170 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  hild of the pare
31180 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  nt. Copy the con
31190 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
311a0 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69   ** child page i
311b0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20  nto the parent, 
311c0 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f  decreasing the o
311d0 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66  verall height of
311e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72   the.    ** b-tr
311f0 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20  ee structure by 
31200 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73  one. This is des
31210 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62  cribed as the "b
31220 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72  alance-shallower
31230 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67  ".    ** sub-alg
31240 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64  orithm in some d
31250 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  ocumentation..  
31260 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
31270 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
31280 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
31290 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79  the call to copy
312a0 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20  NodeContent() . 
312b0 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70     ** sets all p
312c0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
312d0 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
312e0 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61   to database ima
312f0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
31300 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
31310 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64  ointer is stored
31320 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74   within the cont
31330 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64  ent being copied
31340 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31350 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72  The second asser
31360 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  t below verifies
31370 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20   that the child 
31380 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
31390 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20  nted.    ** (it 
313a0 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77  must be, as it w
313b0 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72  as just reconstr
313c0 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65  ucted using asse
313d0 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69  mblePage()). Thi
313e0 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f  s.    ** is impo
313f0 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72  rtant if the par
31400 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73  ent page happens
31410 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66   to be page 1 of
31420 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
31430 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a    ** image.  */.
31440 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
31450 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
31460 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t( apNew[0]->nFr
31470 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28  ee == .        (
31480 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b  get2byte(&apNew[
31490 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70  0]->aData[5])-ap
314a0 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73  New[0]->cellOffs
314b0 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65  et-apNew[0]->nCe
314c0 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20  ll*2) .    );.  
314d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
314e0 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43  =(rc = copyNodeC
314f0 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
31500 20 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20   pParent)) ){.  
31510 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
31520 65 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20  e(apNew[0]);.   
31530 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49   }.  }else if( I
31540 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31550 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
31560 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31570 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
31580 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
31590 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
315a0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
315b0 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
315c0 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
315d0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
315e0 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
315f0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
31600 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
31610 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
31620 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
31630 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
31640 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
31650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
31660 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
31670 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
31680 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
31690 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
316a0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
316b0 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
316c0 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
316d0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
316e0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
316f0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
31700 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
31710 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
31720 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
31730 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
31740 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
31750 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
31760 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
31770 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
31780 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
31790 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
317a0 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
317b0 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
317c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
317d0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
317e0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
317f0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
31800 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
31810 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
31820 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
31830 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
31840 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
31850 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
31860 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
31870 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
31880 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
31890 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
318a0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
318b0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
318c0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
318d0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
318e0 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
318f0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
31900 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
31910 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
31920 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
31930 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
31940 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
31950 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
31960 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
31970 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
31980 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
31990 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
319a0 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
319b0 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
319c0 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
319d0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
319e0 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
319f0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
31a00 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
31a10 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
31a20 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
31a30 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
31a40 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
31a50 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
31a60 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
31a70 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
31a80 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
31a90 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
31aa0 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
31ab0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
31ac0 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
31ad0 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
31ae0 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
31af0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
31b00 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
31b10 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
31b20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
31b30 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
31b40 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
31b50 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
31b60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
31b70 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
31b80 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
31b90 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
31ba0 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
31bb0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
31bc0 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
31bd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
31be0 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
31bf0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
31c00 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
31c10 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
31c20 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
31c30 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
31c40 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
31c50 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
31c60 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
31c70 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
31c80 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
31c90 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
31ca0 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
31cb0 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
31cc0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
31cd0 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
31ce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d00 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
31d10 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
31d20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
31d50 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
31d60 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
31d70 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20  or(i=0; i<nCell 
31d80 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
31d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
31da0 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
31db0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
31dc0 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
31dd0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
31de0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
31df0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
31e00 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
31e10 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
31e20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
31e30 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
31e40 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
31e50 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
31e60 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
31e70 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
31e80 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
31e90 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
31ea0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
31eb0 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
31ec0 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
31ed0 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
31ee0 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
31ef0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
31f00 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
31f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
31f20 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
31f30 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
31f40 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
31f50 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
31f60 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
31f70 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
31f80 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
31f90 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
31fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
31fb0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
31fc0 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
31fd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31fe0 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
31ff0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
32000 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
32010 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
32020 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
32030 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
32040 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
32050 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
32060 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
32070 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32080 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
32090 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
320a0 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
320b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
320c0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
320d0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
320e0 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
320f0 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
32100 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
32110 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
32120 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
32130 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
32140 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
32150 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
32160 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
32170 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
32180 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
32190 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
321a0 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
321b0 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
321c0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
321d0 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
321e0 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
321f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
32200 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
32210 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
32220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32230 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
32240 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
32250 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
32260 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
32270 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
32280 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
32290 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
322a0 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
322b0 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
322c0 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
322d0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
322e0 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
322f0 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
32300 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
32310 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
32320 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
32330 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
32340 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
32350 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
32360 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
32370 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
32380 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
32390 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
323a0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
323b0 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
323c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
323d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
323e0 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
323f0 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[i]), PTRMAP_B
32400 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
32410 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32420 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
32430 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
32440 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l && rc==SQLITE_
32450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32460 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
32470 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
32480 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
32490 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
324a0 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
324b0 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
324c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
324d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e  QLITE_OK && i<nN
324e0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
324f0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
32500 28 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34  (..    pBt, get4
32510 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e  byte(&apNew[i]->
32520 61 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41  aData[8]), PTRMA
32530 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
32540 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ]->pgno);.      
32550 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
32560 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
32570 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
32580 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
32590 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
325a0 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
325b0 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
325c0 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
325d0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
325e0 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
325f0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
32600 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
32610 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
32620 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
32630 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
32640 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
32650 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
32660 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
32670 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32680 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
32690 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
326a0 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
326b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
326c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
326d0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
326e0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
326f0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
32700 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
32710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
32720 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
32730 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
32740 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
32750 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
32760 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
32770 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
32780 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
32790 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
327a0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
327b0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
327c0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
327d0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
327e0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
327f0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
32800 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
32810 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
32820 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
32830 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32840 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
32850 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
32860 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
32870 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
32880 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
32890 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
328a0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
328b0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
328c0 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
328d0 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
328e0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
328f0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
32900 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
32910 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
32920 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
32930 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
32940 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
32950 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
32960 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
32970 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
32980 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
32990 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
329a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
329b0 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
329c0 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
329d0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
329e0 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
329f0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
32a00 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
32a10 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
32a20 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
32a30 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
32a40 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
32a50 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
32a60 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
32a70 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
32a80 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
32a90 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
32aa0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
32ab0 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
32ac0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
32ad0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
32ae0 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
32af0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
32b00 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
32b10 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
32b20 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
32b30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32b40 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
32b50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
32b60 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
32b70 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
32b80 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
32b90 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
32ba0 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
32bb0 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
32bc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32be0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
32bf0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
32c00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
32c10 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
32c20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
32c30 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
32c40 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
32c50 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
32c60 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32c70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
32c80 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
32c90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32ca0 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
32cb0 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
32cc0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
32cd0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
32ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32cf0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32d00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
32d10 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
32d20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32d30 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
32d40 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
32d50 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
32d60 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
32d70 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
32d80 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
32d90 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
32da0 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
32db0 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
32dc0 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
32dd0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
32de0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
32df0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
32e00 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
32e10 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
32e20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32e30 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
32e40 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
32e50 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
32e60 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c  ->pgno,0)).   ||
32e70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32e80 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
32e90 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29  t(pRoot, pChild)
32ea0 29 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56  ).   || (ISAUTOV
32eb0 41 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20  ACUUM && .      
32ec0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32ed0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
32ee0 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
32ef0 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
32f00 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20  >pgno))).  ){.  
32f10 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a    *ppChild = 0;.
32f20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32f30 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  pChild);.    ret
32f40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
32f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32f60 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
32f70 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
32f80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32f90 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32fa0 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
32fb0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
32fc0 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
32fd0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pRoot->nCell );.
32fe0 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
32ff0 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
33000 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f   into %d\n", pRo
33010 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ot->pgno, pChild
33020 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20  ->pgno));..  /* 
33030 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f  Copy the overflo
33040 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f  w cells from pRo
33050 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a  ot to pChild */.
33060 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
33070 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61  >aOvfl, pRoot->a
33080 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76  Ovfl, pRoot->nOv
33090 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
330a0 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  oot->aOvfl[0]));
330b0 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
330c0 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
330d0 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
330e0 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
330f0 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
33100 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
33110 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
33120 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
33130 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
33140 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
33150 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
33160 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
33170 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
33180 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
33190 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
331a0 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
331b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
331c0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
331d0 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
331e0 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
331f0 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
33200 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
33210 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
33220 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
33230 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
33240 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
33250 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
33260 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
33270 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
33280 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
33290 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
332a0 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
332b0 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
332c0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
332d0 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
332e0 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
332f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a  ce_nonroot().*/.
33300 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
33310 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
33320 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
33330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
33340 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75  t int nMin = pCu
33350 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
33360 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38  ze * 2 / 3;.  u8
33370 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33380 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70  ace[13];.  u8 *p
33390 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53  Free = 0;..  TES
333a0 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
333b0 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20  ce_quick_called 
333c0 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  = 0 );.  TESTONL
333d0 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  Y( int balance_d
333e0 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30  eeper_called = 0
333f0 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
33400 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
33410 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d  ->iPage;.    Mem
33420 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
33430 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
33440 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  ];..    if( iPag
33450 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
33460 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
33470 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ow ){.        /*
33480 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
33490 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
334a0 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69  overfull. In thi
334b0 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a  s case call the.
334c0 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
334d0 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63  ce_deeper() func
334e0 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
334f0 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74   new child for t
33500 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
33510 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79       ** and copy
33520 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
33530 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
33540 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68  t-page to it. Th
33550 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78  e.        ** nex
33560 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
33570 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
33580 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c  balance the chil
33590 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  d page..        
335a0 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  */ .        asse
335b0 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  rt( (balance_dee
335c0 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  per_called++)==0
335d0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
335e0 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
335f0 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70  pPage, &pCur->ap
33600 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Page[1]);.      
33610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33630 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31   pCur->iPage = 1
33640 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
33650 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
33660 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
33670 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20  aiIdx[1] = 0;.  
33680 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33690 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d  pCur->apPage[1]-
336a0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
336b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
336c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
336d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
336e0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
336f0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
33700 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
33710 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
33720 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
33730 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
33740 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
33750 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
33760 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
33770 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
33780 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
33790 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
337a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
337b0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
337c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
337d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
337e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
337f0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
33800 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
33810 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
33820 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
33830 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
33840 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f      && pPage->aO
33850 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
33860 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  e->nCell.       
33870 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67    && pParent->pg
33880 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26  no!=1.         &
33890 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
338a0 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29  ==iIdx.        )
338b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
338c0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  all balance_quic
338d0 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20  k() to create a 
338e0 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70  new sibling of p
338f0 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20  Page on which.  
33900 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74          ** to st
33910 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ore the overflow
33920 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71   cell. balance_q
33930 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61  uick() inserts a
33940 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20   new cell.      
33950 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72      ** into pPar
33960 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
33970 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65  ause pParent ove
33980 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20  rflow. If this. 
33990 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
339a0 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e  ens, the next in
339b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
339c0 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
339d0 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20  ance pParent .  
339e0 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65          ** use e
339f0 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f  ither balance_no
33a00 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e  nroot() or balan
33a10 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74  ce_deeper(). Unt
33a20 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  il this.        
33a30 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
33a40 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
33a50 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
33a60 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33a70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ace[].          
33a80 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  ** buffer. .    
33a90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
33aa0 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73     ** The purpos
33ab0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
33ac0 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74  ng assert() is t
33ad0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c  o check that onl
33ae0 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
33af0 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
33b00 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
33b10 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
33b20 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
33b30 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
33b40 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72  ion. If this wer
33b50 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20  e not verified, 
33b60 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76  a subtle bug inv
33b70 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20  olving reuse.   
33b80 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
33b90 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33ba0 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61  ace[] might snea
33bb0 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  k in..          
33bc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
33bd0 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75  ert( (balance_qu
33be0 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  ick_called++)==0
33bf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
33c00 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b   = balance_quick
33c10 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c  (pParent, pPage,
33c20 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33c30 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ace);.        }e
33c40 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
33c50 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
33c60 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
33c70 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  call balance_non
33c80 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74  root() to redist
33c90 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20  ribute cells.   
33ca0 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
33cb0 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
33cc0 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69  o 2 of its sibli
33cd0 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
33ce0 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20  nvolves.        
33cf0 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74    ** modifying t
33d00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
33d10 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
33d20 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
33d30 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
33d40 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
33d50 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68  or underfull. Th
33d60 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
33d70 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a   of the do-loop.
33d80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c            ** wil
33d90 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  l balance the pa
33da0 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72  rent page to cor
33db0 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20  rect this..     
33dc0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
33dd0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72     ** If the par
33de0 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
33df0 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f   overfull, the o
33e00 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20  verflow cell or 
33e10 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
33e20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
33e30 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
33e40 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d  er allocated imm
33e50 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20  ediately below. 
33e60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20  .          ** A 
33e70 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
33e80 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
33e90 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69  oop will deal wi
33ea0 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  th this by.     
33eb0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
33ec0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33ed0 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ) (balance_deepe
33ee0 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  r() may be calle
33ef0 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20  d first,.       
33f00 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65     ** but it doe
33f10 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f  sn't deal with o
33f20 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20  verflow cells - 
33f30 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20  just moves them 
33f40 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  to a.          *
33f50 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  * different page
33f60 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62  ). Once this sub
33f70 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
33f80 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33f90 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
33fa0 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69  has completed, i
33fb0 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c  t is safe to rel
33fc0 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20  ease the pSpace 
33fd0 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20  buffer used by. 
33fe0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
33ff0 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61  previous call, a
34000 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  s the overflow c
34010 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61  ell data will ha
34020 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  ve been .       
34030 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74     ** copied eit
34040 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  her into the bod
34050 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
34060 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65  page or into the
34070 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a   new.          *
34080 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  * pSpace buffer 
34090 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61  passed to the la
340a0 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c  tter call to bal
340b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a  ance_nonroot()..
340c0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
340d0 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63         u8 *pSpac
340e0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
340f0 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d  alloc(pCur->pBt-
34100 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
34110 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
34120 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65  ce_nonroot(pPare
34130 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65  nt, iIdx, pSpace
34140 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20  , iPage==1);.   
34150 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65         if( pFree
34160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34170 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e  /* If pFree is n
34180 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
34190 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65  ts to the pSpace
341a0 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20   buffer used .  
341b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
341c0 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20  a previous call 
341d0 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
341e0 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e  ot(). Its conten
341f0 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20  ts are.         
34200 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64     ** now stored
34210 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20   either on real 
34220 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f  database pages o
34230 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20  r within the .  
34240 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77            ** new
34250 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20   pSpace buffer, 
34260 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66  so it may be saf
34270 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20  ely freed here. 
34280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
34290 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
342a0 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
342b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
342c0 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
342d0 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  er will be freed
342e0 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20   after the next 
342f0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
34300 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e    ** balance_non
34310 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20  root(), or just 
34320 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
34330 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68  tion returns, wh
34340 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20  ichever.        
34350 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74    ** comes first
34360 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
34370 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20  Free = pSpace;. 
34380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34390 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ..      pPage->n
343a0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
343b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
343c0 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
343d0 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63  e do-loop balanc
343e0 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
343f0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c  ge. */.      rel
34400 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34410 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61  .      pCur->iPa
34420 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  ge--;.    }.  }w
34430 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
34440 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46  _OK );..  if( pF
34450 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
34460 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
34470 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34480 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc;.}.../*.** In
34490 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
344a0 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
344b0 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
344c0 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
344d0 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
344e0 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
344f0 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
34500 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
34510 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
34520 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
34530 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
34540 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
34550 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
34560 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
34570 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
34580 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
34590 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
345a0 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
345b0 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
345c0 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
345d0 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
345e0 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
345f0 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
34600 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
34610 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  both ignored..**
34620 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
34630 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
34640 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
34650 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63  n a successful c
34660 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f  all to.** Moveto
34670 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65  Unpacked() to se
34680 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74  ek cursor pCur t
34690 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68  o (pKey, nKey) h
346a0 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
346b0 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65  en performed. se
346c0 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  ekResult is the 
346d0 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65  search result re
346e0 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69  turned (a negati
346f0 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20  ve.** number if 
34700 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
34710 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
34720 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b  smaller than (pK
34730 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a  ey, nKey), or.**
34740 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
34750 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  e if pCur points
34760 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74   at an etry that
34770 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
34780 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29  .** (pKey, nKey)
34790 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ). .**.** If the
347a0 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
347b0 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
347c0 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
347d0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a   point to any .*
347e0 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f  * entry or to no
347f0 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49   entry at all. I
34800 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
34810 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f   function has to
34820 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72   seek.** the cur
34830 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e  sor before the n
34840 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e  ew key can be in
34850 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
34860 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
34870 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
34880 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
34890 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
348a0 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
348b0 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
348c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
348d0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
348e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
348f0 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
34900 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
34910 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
34920 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
34930 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
34940 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
34950 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
34960 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34970 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
34980 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
34990 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
349a0 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20  pendBias,       
349b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
349c0 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
349d0 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
349e0 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
349f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a00 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
34a10 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  ior MovetoUnpack
34a20 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  ed() call */.){.
34a30 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
34a40 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
34a50 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
34a60 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
34a70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
34a80 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
34a90 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
34aa0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
34ab0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34ac0 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
34ad0 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
34ae0 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
34af0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
34b00 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
34b10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
34b20 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
34b30 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
34b40 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
34b50 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nly );.  assert(
34b60 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b   pCur->wrFlag );
34b70 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
34b80 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
34b90 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ck(p, pCur->pgno
34ba0 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79  Root, pCur->pKey
34bb0 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a  Info!=0, 2) );..
34bc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
34bd0 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  an insert into a
34be0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69   table b-tree, i
34bf0 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
34c00 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72  crblob .  ** cur
34c10 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
34c20 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61   row being repla
34c30 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ced (assuming th
34c40 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a  is is a replace.
34c50 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d    ** operation -
34c60 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   if it is not, t
34c70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
34c80 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20  a no-op).  */.  
34c90 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  if( pCur->pKeyIn
34ca0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76  fo==0 ){.    inv
34cb0 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
34cc0 75 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e  ursors(p, pCur->
34cd0 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
34ce0 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  0);.  }..  if( p
34cf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34d00 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
34d10 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
34d20 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
34d30 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
34d40 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
34d50 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
34d60 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  is table..  **. 
34d70 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65   ** In some case
34d80 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62  s, the call to b
34d90 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c  treeMoveto() bel
34da0 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46  ow is a no-op. F
34db0 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c  or.  ** example,
34dc0 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
34dd0 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
34de0 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65  e with auto-gene
34df0 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20  rated integer.  
34e00 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42  ** keys, the VDB
34e10 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20  E layer invokes 
34e20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
34e30 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
34e40 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67   the .  ** integ
34e50 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49  er key to use. I
34e60 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69  t then calls thi
34e70 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63  s function to ac
34e80 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68  tually insert th
34e90 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74  e .  ** data int
34ea0 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54  o the intkey B-T
34eb0 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
34ec0 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e btreeMoveto() 
34ed0 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20  recognizes.  ** 
34ee0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
34ef0 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65  is already where
34f00 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
34f10 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68  and returns with
34f20 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61  out.  ** doing a
34f30 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69  ny work. To avoi
34f40 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73  d thwarting thes
34f50 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c  e optimizations,
34f60 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
34f70 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65  .  ** not to cle
34f80 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65  ar the cursor he
34f90 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20  re..  */.  if(. 
34fa0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
34fb0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
34fc0 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
34fd0 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
34fe0 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53  | (!loc &&.    S
34ff0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
35000 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
35010 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
35020 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
35030 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72  .  )){.    retur
35040 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
35050 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
35060 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
35070 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  | (pCur->eState=
35080 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
35090 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50  && loc) );..  pP
350a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
350b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
350c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
350d0 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
350e0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
350f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
35100 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
35110 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
35120 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
35130 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
35140 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
35150 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
35160 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
35170 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
35180 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
35190 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
351a0 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
351b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
351c0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
351d0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
351e0 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
351f0 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
35200 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
35210 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
35220 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
35230 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
35240 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
35250 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
35260 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
35270 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
35280 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
35290 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
352a0 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
352b0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
352c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
352d0 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
352e0 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20  E(pBt) );.  idx 
352f0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
35300 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
35310 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  ( loc==0 ){.    
35320 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  u16 szOld;.    a
35330 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65  ssert( idx<pPage
35340 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
35350 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35360 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
35370 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
35380 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
35390 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
353a0 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
353b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
353c0 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
353d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
353e0 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
353f0 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
35400 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
35410 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
35420 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
35430 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
35440 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
35450 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
35460 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
35470 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43  ;.    rc = dropC
35480 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
35490 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  szOld);.    if( 
354a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
354b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
354c0 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
354d0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
354e0 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
354f0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
35500 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
35510 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
35520 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
35530 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
35540 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35550 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
35560 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
35570 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77  (pPage, idx, new
35580 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
35590 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
355a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
355b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
355c0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
355d0 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
355e0 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
355f0 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
35600 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
35610 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
35620 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
35630 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
35640 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
35650 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
35660 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
35670 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
35680 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
35690 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
356a0 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
356b0 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
356c0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
356d0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
356e0 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
356f0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
35700 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
35710 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
35720 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
35730 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
35740 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
35750 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
35760 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
35770 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
35780 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
35790 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
357a0 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
357b0 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
357c0 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
357d0 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
357e0 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
357f0 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
35800 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
35810 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
35820 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
35830 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
35840 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
35850 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
35860 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
35870 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
35880 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
35890 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
358a0 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
358b0 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
358c0 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
358d0 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
358e0 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
358f0 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
35900 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
35910 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
35920 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
35930 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
35940 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
35950 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
35960 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
35970 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
35980 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
35990 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
359a0 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
359b0 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
359c0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
359d0 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
359e0 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
359f0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
35a00 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
35a10 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
35a20 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
35a30 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
35a40 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
35a50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
35a60 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
35a70 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
35a80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a90 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
35aa0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
35ab0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
35ac0 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
35ad0 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
35ae0 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
35af0 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
35b00 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
35b10 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
35b20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
35b30 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
35b40 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
35b50 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
35b60 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
35b70 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
35b80 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
35b90 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
35ba0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
35bb0 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
35bc0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
35bd0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
35be0 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
35bf0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35c00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
35c10 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
35c20 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
35c30 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
35c40 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
35c50 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
35c60 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
35c70 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
35c80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35c90 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
35ca0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
35cb0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
35cc0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
35cd0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
35ce0 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
35cf0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
35d00 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
35d10 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
35d20 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
35d30 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
35d40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35d50 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
35d60 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
35d70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35d90 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
35da0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
35db0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
35dc0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35dd0 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
35de0 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
35df0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
35e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35e10 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
35e20 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
35e30 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
35e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
35e60 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
35e70 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
35e80 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
35e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
35ea0 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
35eb0 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
35ec0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
35ed0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35ee0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35ef0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35f00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
35f10 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
35f20 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
35f30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
35f40 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
35f50 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
35f60 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
35f70 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
35f80 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
35f90 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  2) );.  assert( 
35fa0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
35fb0 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
35fc0 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  oot) );..  if( N
35fd0 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
35fe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
35ff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
36000 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
36010 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
36020 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
36030 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
36040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36050 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
36060 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
36070 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  wry. */.  }..  /
36080 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
36090 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
360a0 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20  to remove a row 
360b0 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74  from a table b-t
360c0 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69  ree,.  ** invali
360d0 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
360e0 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
360f0 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
36100 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69  deleted.  */.  i
36110 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
36120 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
36130 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
36140 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70  rsors(p, pCur->p
36150 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69  gnoRoot, pCur->i
36160 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  nfo.nKey, 0);.  
36170 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20  }..  iCellDepth 
36180 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
36190 20 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72   iCellIdx = pCur
361a0 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70  ->aiIdx[iCellDep
361b0 74 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  th];.  pPage = p
361c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
361d0 6c 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c  lDepth];.  pCell
361e0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
361f0 65 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20  e, iCellIdx);.. 
36200 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
36210 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
36220 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69  ntry to delete i
36230 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
36240 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  e, move.  ** the
36250 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
36260 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
36270 74 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73  the tree that is
36280 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20   smaller than.  
36290 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69  ** the entry bei
362a0 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
362b0 20 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61   cell will repla
362c0 63 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  ce the cell bein
362d0 67 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66  g deleted.  ** f
362e0 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
362f0 20 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76   node. The 'prev
36300 69 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75  ious' entry is u
36310 73 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73  sed for this ins
36320 74 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tead.  ** of the
36330 20 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61   'next' entry, a
36340 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  s the previous e
36350 6e 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61  ntry is always a
36360 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
36370 2a 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  * sub-tree heade
36380 64 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70  d by the child p
36390 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  age of the cell 
363a0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54  being deleted. T
363b0 68 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62  his makes.  ** b
363c0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65  alancing the tre
363d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
363e0 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
363f0 20 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69   easier.  */.  i
36400 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
36410 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  ){.    int notUs
36420 65 64 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ed;.    if( SQLI
36430 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
36440 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
36450 73 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  s(pCur, &notUsed
36460 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  )) ){.      retu
36470 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
36480 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
36490 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
364a0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
364b0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
364c0 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61  e before.  ** ma
364d0 6b 69 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63  king any modific
364e0 61 74 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65  ations. Make the
364f0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
36500 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65   the entry to be
36510 20 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77   .  ** deleted w
36520 72 69 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72  ritable. Then fr
36530 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
36540 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
36550 20 77 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20   with the .  ** 
36560 65 6e 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c  entry and finall
36570 79 20 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c  y remove the cel
36580 6c 20 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69  l itself from wi
36590 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20  thin the page.  
365a0 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
365b0 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
365c0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
365d0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
365e0 75 72 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ur)).   || SQLIT
365f0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
36600 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36610 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20  age->pDbPage)). 
36620 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
36630 28 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28  (rc = clearCell(
36640 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20  pPage, pCell)). 
36650 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
36660 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70  (rc = dropCell(p
36670 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20  Page, iCellIdx, 
36680 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
36690 65 2c 20 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b  e, pCell))).  ){
366a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
366b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
366c0 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61   cell deleted wa
366d0 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e  s not located on
366e0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
366f0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  en the cursor.  
36700 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
36710 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
36720 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e  largest entry in
36730 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
36740 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  aded.  ** by the
36750 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74   child-page of t
36760 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73  he cell that was
36770 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72   just deleted fr
36780 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  om an internal. 
36790 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65   ** node. The ce
367a0 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66  ll from the leaf
367b0 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62   node needs to b
367c0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69  e moved to the i
367d0 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64  nternal.  ** nod
367e0 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
367f0 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20   deleted cell.  
36800 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
36810 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d  >leaf ){.    Mem
36820 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43  Page *pLeaf = pC
36830 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36840 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
36850 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f   nCell;.    Pgno
36860 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67   n = pCur->apPag
36870 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d  e[iCellDepth+1]-
36880 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67  >pgno;.    unsig
36890 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a  ned char *pTmp;.
368a0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
368b0 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  dCell(pLeaf, pLe
368c0 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  af->nCell-1);.  
368d0 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69    nCell = cellSi
368e0 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65  zePtr(pLeaf, pCe
368f0 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ll);.    assert(
36900 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
36910 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  t)>=nCell );..  
36920 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
36930 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54  ace(pBt);.    pT
36940 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  mp = pBt->pTmpSp
36950 61 63 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  ace;..    if( SQ
36960 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
36970 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36980 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29  (pLeaf->pDbPage)
36990 29 20 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  ) .     || SQLIT
369a0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65  E_OK!=(rc = inse
369b0 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  rtCell(pPage, iC
369c0 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c  ellIdx, pCell-4,
369d0 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20   nCell+4, pTmp, 
369e0 6e 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  n)).     || SQLI
369f0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f  TE_OK!=(rc = dro
36a00 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  pCell(pLeaf, pLe
36a10 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65  af->nCell-1, nCe
36a20 6c 6c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ll)).    ){.    
36a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36a40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c   }.  }..  /* Bal
36a50 61 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49  ance the tree. I
36a60 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
36a70 74 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ted was located 
36a80 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a  on a leaf page,.
36a90 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75    ** then the cu
36aa0 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74  rsor still point
36ab0 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
36ac0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
36ad0 20 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c   first.  ** call
36ae0 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65   to balance() re
36af0 70 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20  pairs the tree, 
36b00 61 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20  and the if(...) 
36b10 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a  condition is.  *
36b20 2a 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20  * never true..  
36b30 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
36b40 65 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20  e, if the entry 
36b50 64 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61  deleted was on a
36b60 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
36b70 70 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  page, then.  ** 
36b80 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
36b90 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
36ba0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63  e from which a c
36bb0 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ell was removed 
36bc0 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20  to.  ** replace 
36bd0 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
36be0 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
36bf0 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  al node. This is
36c00 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74   slightly.  ** t
36c10 72 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61  ricky as the lea
36c20 66 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e  f node may be un
36c30 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65  derfull, and the
36c40 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d   internal node m
36c50 61 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65  ay.  ** be eithe
36c60 72 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66  r under or overf
36c70 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
36c80 65 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63  e run the balanc
36c90 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  ing algorithm.  
36ca0 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  ** on the leaf n
36cb0 6f 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68  ode first. If th
36cc0 65 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65  e balance procee
36cd0 64 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70  ds far enough up
36ce0 20 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74   the.  ** tree t
36cf0 68 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75  hat we can be su
36d00 72 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62  re that any prob
36d10 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72  lem in the inter
36d20 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a  nal node has.  *
36d30 2a 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64  * been corrected
36d40 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65  , so be it. Othe
36d50 72 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c  rwise, after bal
36d60 61 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20  ancing the leaf 
36d70 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20  node,.  ** walk 
36d80 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68  the cursor up th
36d90 65 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e  e tree to the in
36da0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20  ternal node and 
36db0 62 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20  balance it as . 
36dc0 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   ** well.  */.  
36dd0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
36de0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
36df0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d  LITE_OK && pCur-
36e00 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36e10 68 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  h ){.    while( 
36e20 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c  pCur->iPage>iCel
36e30 6c 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  lDepth ){.      
36e40 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
36e50 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36e60 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
36e70 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
36e80 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
36e90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36ea0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
36eb0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
36ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36ed0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
36ee0 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
36ef0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
36f00 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
36f10 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
36f20 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
36f30 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
36f40 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
36f50 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
36f60 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
36f70 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
36f80 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
36f90 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
36fa0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
36fb0 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
36fc0 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
36fd0 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
36fe0 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
36ff0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
37000 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
37010 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
37020 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
37030 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
37040 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
37050 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
37060 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
37070 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
37080 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
37090 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
370a0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
370b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
370c0 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
370d0 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
370e0 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
370f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
37100 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37110 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37120 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
37130 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
37140 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
37150 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
37160 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
37170 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
37180 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
37190 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
371a0 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
371b0 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
371c0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
371d0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
371e0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
371f0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
37200 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
37210 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
37220 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
37230 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
37240 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
37250 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
37260 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
37270 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
37280 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
37290 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
372a0 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
372b0 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
372c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
372d0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
372e0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
372f0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
37300 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
37310 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
37320 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
37330 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
37340 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
37350 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
37360 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
37370 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
37380 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
37390 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
373a0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
373b0 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
373c0 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
373d0 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
373e0 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
373f0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
37400 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
37410 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
37420 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
37430 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
37440 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
37450 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
37460 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
37470 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
37480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
37490 74 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c  tMeta(p, BTREE_L
374a0 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
374b0 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
374c0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
374d0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
374e0 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
374f0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
37500 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
37510 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
37520 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
37530 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
37540 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d  while( pgnoRoot=
37550 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
37560 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
37570 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
37580 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
37590 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
375a0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
375b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
375c0 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
375d0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
375e0 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
375f0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
37600 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
37610 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
37620 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
37630 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
37640 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
37650 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
37660 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
37670 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
37680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
37690 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
376a0 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
376b0 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
376c0 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
376d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
376e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
376f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
37700 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
37710 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
37720 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
37730 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
37740 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
37750 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
37760 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
37770 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
37780 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
37790 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
377a0 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
377b0 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
377c0 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
377d0 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
377e0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
377f0 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
37800 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
37810 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
37820 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
37830 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
37840 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
37850 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
37860 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
37870 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
37880 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
37890 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
378a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
378b0 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
378c0 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
378d0 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
378e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
378f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
37900 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
37910 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
37920 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
37940 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37950 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
37960 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
37970 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
37980 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
37990 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
379a0 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
379b0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
379c0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  GE ){.        rc
379d0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
379e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
379f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37a00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37a10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37a20 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
37a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
37a40 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
37a50 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
37a60 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
37a70 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
37a80 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
37a90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
37aa0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
37ab0 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
37ac0 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c  rPage, pgnoMove,
37ad0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61   0);.      relea
37ae0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
37af0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
37b00 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
37b10 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
37b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37b30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
37b40 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37b60 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
37b70 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
37b80 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
37b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37ba0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
37bb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37bc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37bd0 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
37be0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37c00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37c10 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37c20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37c30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
37c50 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
37c60 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
37c70 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
37c80 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
37c90 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
37ca0 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
37cb0 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
37cc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
37cd0 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
37ce0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
37cf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37d00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37d10 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
37d20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
37d30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37d40 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
37d50 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
37d60 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37d70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37d80 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
37d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
37da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
37db0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37dc0 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
37dd0 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
37de0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37df0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
37e00 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
37e10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37e20 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
37e30 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
37e40 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
37e50 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
37e60 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37e70 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
37e80 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
37e90 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
37ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37eb0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
37ec0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
37ed0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
37ee0 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
37ef0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
37f00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
37f10 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
37f20 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
37f30 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67  p, piTable, flag
37f40 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
37f50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
37f60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37f70 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
37f80 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
37f90 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
37fa0 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
37fb0 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
37fc0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
37fd0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
37fe0 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
37ff0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
38000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
38010 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
38020 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
38030 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
38040 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
38050 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
38060 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
38070 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61  Flag,     /* Dea
38080 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
38090 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  true */.  int *p
380a0 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d  nChange.){.  Mem
380b0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
380c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
380d0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
380e0 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  l;.  int i;..  a
380f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
38100 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
38110 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
38120 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
38130 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
38140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38150 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
38160 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
38170 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
38180 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
38190 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
381a0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
381b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
381c0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
381d0 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  {.    pCell = fi
381e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
381f0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
38200 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
38210 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
38220 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
38230 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20  byte(pCell), 1, 
38240 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  pnChange);.     
38250 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
38260 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
38270 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
38280 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
38290 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
382a0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
382b0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
382c0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
382d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
382e0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
382f0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
38300 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
38310 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20  ->aData[8]), 1, 
38320 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69  pnChange);.    i
38330 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
38340 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
38350 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
38360 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  pnChange ){.    
38370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
38380 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e  ntKey );.    *pn
38390 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d  Change += pPage-
383a0 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66  >nCell;.  }.  if
383b0 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29  ( freePageFlag )
383c0 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
383d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
383e0 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
383f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
38400 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
38410 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50  ==0 ){.    zeroP
38420 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
38430 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
38440 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
38450 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
38460 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
38470 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
38480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38490 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
384a0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
384b0 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table